在 Nix 中向现有包添加和安装运行时依赖项的最佳方法?
Best way to add and install runtime dependency to an existing package in Nix?
使用 nix-env -i <pkg>
在 Nix 中安装包并使用 source ~/.nix-profile/etc/profile.d/nix.sh
添加 Nix 环境会导致该包出现在通常需要的 $PATH
之上。
如果我想为已经存在的包安装和指定运行时依赖项(例如 python
或 perl
解释器),但不希望该依赖项出现在其余包中,该怎么办?系统环境?
在我的例子中,我想将 perl
依赖项添加到 fzf package as it uses perl here。但出于兼容性原因,我不希望它出现在系统的其余部分。
我尝试用 packageOverrides
覆盖 fzf
但首先它似乎只适用于构建依赖项,其次没有参数指定 perl
.
通常您会使用 wrapProgram 将可执行文件替换为在调用实际可执行文件之前修改 PATH
的脚本。
这种情况比较复杂,因为它不是一个独立的程序,而是一个要导入的脚本,所以不能使用包装器。在 postInstall
中,您可以使用 substituteInPlace,它看起来有点像
substituteInPlace $out/path-to-keybindings.zsh --replace '| perl ' '| ${pkgs.perl}/bin/perl '
这将修补脚本以通过其绝对存储路径引用 perl,而不修改环境。
使用 nix-env -i <pkg>
在 Nix 中安装包并使用 source ~/.nix-profile/etc/profile.d/nix.sh
添加 Nix 环境会导致该包出现在通常需要的 $PATH
之上。
如果我想为已经存在的包安装和指定运行时依赖项(例如 python
或 perl
解释器),但不希望该依赖项出现在其余包中,该怎么办?系统环境?
在我的例子中,我想将 perl
依赖项添加到 fzf package as it uses perl here。但出于兼容性原因,我不希望它出现在系统的其余部分。
我尝试用 packageOverrides
覆盖 fzf
但首先它似乎只适用于构建依赖项,其次没有参数指定 perl
.
通常您会使用 wrapProgram 将可执行文件替换为在调用实际可执行文件之前修改 PATH
的脚本。
这种情况比较复杂,因为它不是一个独立的程序,而是一个要导入的脚本,所以不能使用包装器。在 postInstall
中,您可以使用 substituteInPlace,它看起来有点像
substituteInPlace $out/path-to-keybindings.zsh --replace '| perl ' '| ${pkgs.perl}/bin/perl '
这将修补脚本以通过其绝对存储路径引用 perl,而不修改环境。