我想添加与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}
'';
我不喜欢必须对路径进行硬编码,但它可以完成工作。