如何引用 Nix 包的存储路径?

如何引用 Nix 包的存储路径?

我想添加与awscli命令完成相关的功能。

在我的特殊情况下,我需要从 获取脚本/nix/store/hvx7xqvjz7r08nsb9kssh1d9s302v3sp-awscli-1.16.106/share/zsh/site-functions/aws_zsh_completer.sh

如何获取/nix/store/hvx7xqvjz7r08nsb9kssh1d9s302v3sp-awscli-1.16.106包 ( ) 的存储路径 ( 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

无论如何,如果您尝试设置 shell 初始化来引用 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 结果中名列前茅,nix store reference所以我将其留在这里。我的问题并不在于我需要从包中的另一个包引用特定文件,我只需要我的包buildInputs在特定存储路径上有一个 rundep ( ) ,这样我就可以将其安装到我的个人资料中,而他们不会进行 GC 处理。 (我厌倦了在使用时不断重新下载路径nix-shell,并且在nix-env -iA nixpkgs.stdenv工作时,nix-env -iA nixpkgs.bash显然是一个不同的副本。)

仅将存储路径放入文本文件中是行不通的,需要首先$out传递它们:builtins.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}
'';

我不喜欢必须对路径进行硬编码,但它可以完成工作。

相关内容