【问题标题】:Best way to add and install runtime dependency to an existing package in Nix?向 Nix 中的现有包添加和安装运行时依赖项的最佳方法?
【发布时间】:2020-09-08 08:22:54
【问题描述】:

在 Nix 中使用 nix-env -i <pkg> 安装软件包并使用 source ~/.nix-profile/etc/profile.d/nix.sh 添加 Nix 环境会导致该软件包出现在 $PATH 的顶部,这通常是可取的。

如果我想为已经存在的包安装并指定运行时依赖项(例如pythonperl 解释器),但不希望其他包和系统环境出现依赖项怎么办?

就我而言,我想将 perl 依赖添加到 fzf package,因为它使用 perl here。但出于兼容性原因,我不希望它出现在系统的其余部分。

我尝试用packageOverrides 覆盖fzf,但首先它似乎仅适用于构建依赖项,其次没有指定perl 的参数。

【问题讨论】:

    标签: nix


    【解决方案1】:

    通常您会使用wrapProgram 将可执行文件替换为修改PATH 的脚本,然后再调用真正的可执行文件。

    在这种情况下它有点复杂,因为它不是一个独立的程序而是一个要导入的脚本,所以它不能使用包装器。在postInstall 中,你可以使用substituteInPlace,看起来有点像

    substituteInPlace $out/path-to-keybindings.zsh --replace '| perl ' '| ${pkgs.perl}/bin/perl '
    

    这将修补脚本以通过其绝对存储路径引用 perl,而无需修改环境。

    【讨论】:

    • 感谢@RobertHensing!似乎应该工作。不幸的是,有不同的问题阻止我测试解决方案。是否提及${pkgs.perl} 将其安装在商店中但未使其对环境完全可见?
    • 没错。它只做最低限度的工作。 "${pkgs.perl}" 计算为存储路径,substituteInPlace 命令将该存储路径放入输出中的文件中。 Perl 因此成为闭包的一部分,但nix-env 看起来并不比直接传递给它的派生更深,所以 Perl 不会因为这个"${pkgs.perl}" 而被添加到PATH
    猜你喜欢
    • 2013-03-08
    • 2014-04-11
    • 2013-08-30
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多