Nixパッケージのストレージパスを参照する方法は?

Nixパッケージのストレージパスを参照する方法は?

awscliコマンド補完関連機能を追加したいです。

私の特別なケースでは、からスクリプトをインポートする必要があります/nix/store/hvx7xqvjz7r08nsb9kssh1d9s302v3sp-awscli-1.16.106/share/zsh/site-functions/aws_zsh_completer.sh

/nix/store/hvx7xqvjz7r08nsb9kssh1d9s302v3sp-awscli-1.16.106package()() の保存パスを取得するにはawscli?なぜなら、私はこの参照をハードコーディングするのが理想的だとは思わないからです。

答え1

これを使用して、取得したいファイルを指すconfiguration.nixシンボリックリンクを作成できます。/etcこれで、先ほど話したシンボリックリンクが届きます。たとえば、このようなもの...

構成.nix

environment.etc."zsh/zshrc".source = "${pkgs.awscli}/share/zsh/site-functions/aws_zsh_completer.sh";

/etc/zsh/zshrc...次を指すシンボリックリンクを生成します。/nix/store/hvx7xqvjz7r08nsb9kssh1d9s302v3sp-awscli-1.16.106/share/zsh/site-functions/aws_zsh_completer.sh

これはを通じて行われるため、configuration.nixシステムが構築されるたびにシンボリックリンクが正しいパスに更新されます。

それから/etc/zsh/zshrcこれを~.zshrc

答え2

これをインストールしnix-locateたら、次のコマンドを使用してデータベースを更新しますnix-index

nix-locate "PATTERN"

答え3

nix eval --rawパッケージの保存パスを印刷するために使用できます。あなたの例:

ls $(nix eval --raw nixpkgs.awscli)/share/zsh/site-functions/aws_zsh_completer.sh

このファイルは、パッケージがすでにローカルのnixストアにある場合にのみ存在します。

⚠️2022年6月にnix 2.8.0にアップデートされました。

コマンドはもはや現状のまま機能しません。私はそれを更新しようとし、これを思い出しました。

ls $(nix --extra-experimental-features nix-command --extra-experimental-features flakes eval -f '<nixpkgs>' --raw 'awscli')/share/zsh/site-functions/aws_zsh_completer.sh

とにかく、nixパッケージを参照するためにシェル初期化を設定したい場合は、現在使用している回避策は次のとおりです。

export NIX_PROFILE_ROOT=${NIX_PROFILES[(w)2]}
maybesource () {
    [[ -r $1 ]] && . $1
}

次に、 nix 構成ファイルを介してパッケージを参照してください。

maybesource $NIX_PROFILE_ROOT/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

答え4

他の問題にぶつかったが、これがDDGの結果で1位を占めたのでnix store referenceここに残しておきます。私の問題は、パッケージ内の他のパッケージの特定のファイルを参照する必要があるということではありません。私のパッケージbuildInputsを自分のプロファイルにインストールできるように、特定のリポジトリパスにrundep()が必要ですが、それらはそうしません。 GC処理。 (使用しながら引き続きパスを再ダウンロードするのも疲れておりnix-shellnix-env -iA nixpkgs.stdenv作業するときはnix-env -iA nixpkgs.bash明らかに別のコピーが出ますね。)

保存パスをテキストファイルに配置するだけでは機能せず、最初に渡す必要があります$outbuiltins.storePath

writeTextDir "share/nix-shell-nogc" (builtins.concatStringsSep "\n" (builtins.map builtins.storePath [
    "/nix/store/2r4gr92p49kpx48s0hxxxv04cqbx4d6c-bash-interactive-5.1-p16-dev"
    "/nix/store/76yin93c7c0jv29kq2hr39d5rzd0v6dg-bash-interactive-5.1-p16-doc"
    "/nix/store/d2m4s6bm6gxpwd22pv20cbhl3ikbhhpb-bash-interactive-5.1-p16-man"
    "/nix/store/p5fqinp9r82fr92rncwxmhd8nsk3igjy-bash-interactive-5.1-p16-info"
]))

または、パスリテラルを使用します(パスが存在しない場合はビルドされませんが、上記の方法は必要に応じてビルド中にダウンロードされます)。

writeTextDir "share/nix-shell-nogc" ''
    ${/nix/store/2r4gr92p49kpx48s0hxxxv04cqbx4d6c-bash-interactive-5.1-p16-dev}
    ${/nix/store/76yin93c7c0jv29kq2hr39d5rzd0v6dg-bash-interactive-5.1-p16-doc}
    ${/nix/store/d2m4s6bm6gxpwd22pv20cbhl3ikbhhpb-bash-interactive-5.1-p16-man}
    ${/nix/store/p5fqinp9r82fr92rncwxmhd8nsk3igjy-bash-interactive-5.1-p16-info}
'';

私はパスをハードコードするのが好きではありませんが、作業は完了です。

関連情報