向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}”