向Nix中的现有包添加和安装运行时依赖项的最佳方法?
使用向Nix中的现有包添加和安装运行时依赖项的最佳方法?,nix,Nix,使用Nix env-i在Nix中安装包,并使用source~/.Nix profile/etc/profile.d/Nix.sh添加Nix环境,会导致该包出现在通常需要的$PATH的顶部 如果我想为已经存在的包安装并指定一个运行时依赖项(例如python或perl解释器),但不想为其余的包和系统环境显示该依赖项,该怎么办 在我的例子中,我想添加perl依赖项,因为它使用perl。但出于兼容性原因,我不希望它出现在系统的其他部分 我尝试用packageOverrides覆盖fzf,但首先它似乎只对
Nix env-i
在Nix中安装包,并使用source~/.Nix profile/etc/profile.d/Nix.sh
添加Nix环境,会导致该包出现在通常需要的$PATH
的顶部
如果我想为已经存在的包安装并指定一个运行时依赖项(例如python
或perl
解释器),但不想为其余的包和系统环境显示该依赖项,该怎么办
在我的例子中,我想添加perl
依赖项,因为它使用perl。但出于兼容性原因,我不希望它出现在系统的其他部分
我尝试用packageOverrides
覆盖fzf
,但首先它似乎只对构建依赖项有效,其次没有参数指定perl
,通常在调用真正的可执行文件之前,您会使用修改路径的脚本替换可执行文件
在这种情况下,它有点复杂,因为它不是一个独立的程序,而是一个要导入的脚本,所以它不能使用包装器。在postInstall
中,您可以使用
substituteInPlace $out/path-to-keybindings.zsh --replace '| perl ' '| ${pkgs.perl}/bin/perl '
这将在不修改环境的情况下,通过绝对存储路径修补脚本以引用perl。谢谢@RobertHensing!看起来应该有用。不幸的是,我遇到了不同的问题,无法测试解决方案。您是否在应用商店中安装了它,但没有使它对环境完全可见?这是正确的。它只做了最起码的工作“${pkgs.perl}”
计算为存储路径,而substituteInPlace
命令将该存储路径放在输出的文件中。因此,Perl成为闭包的一部分,但是nix env
看起来并不比直接传递给它的派生更深入,因此Perl不会被添加到PATH
,因为这“${pkgs.Perl}”
。