gpt4 book ai didi

nix - Nix 中的构建与运行时依赖关系

转载 作者:行者123 更新时间:2023-12-03 03:52:47 27 4
gpt4 key购买 nike

我刚刚开始了解 Nix,所以如果我错过了文档中问题的答案,我深表歉意。

我想使用 Nix 设置一台具有最少库和可执行文件集的安全生产机器。我不希望存在任何编译器或其他构建工具,因为这些可能存在安全风险。

当我安装一些软件包时,它们似乎仅依赖于最小的运行时依赖项集。例如,如果我安装 apache-tomcat-8.0.23,那么我将获得 Java 运行时 (JRE) 和包含 Tomcat 的预构建 JAR 文件。

另一方面,某些软件包似乎包含完整的构建工具链作为依赖项。再举一个基于 Java 的例子,当我安装 spark-1.4.0 时,Nix 会拉取包含编译器的 Java 开发工具包 (JDK),并且还会拉取 Maven 构建工具等。

所以,我的问题如下:

  1. Nix 软件包对构建依赖项和运行时依赖项有什么区别吗?
  2. 为什么有些包似乎依赖于构建工具,而其他包只需要运行时?这一切都取决于软件包作者如何包装应用程序吗?
  3. 如果某个包包含我不想要的构建依赖项,作为运算符(operator),除了为同一应用程序设计自己的替代包之外,我还能做些什么吗?

非常感谢。

最佳答案

  1. 运行时依赖项是构建时依赖项的子集,Nix 通过扫描生成的输出以查找每个构建时依赖项存储路径的哈希部分来自动确定。例如,如果您使用编译器 /nix/store/abcdef...-foo-1.20 构建包,则 Nix 将扫描生成的输出中的所有文件以查找哈希位 abcdef ...。如果找到该哈希,则假定输出以某种方式引用编译器,因此它保留为运行时依赖项。但是,如果未出现该哈希,则生成的输出不会引用编译器,因此无法在运行时访问它,因此 foo-1.20 被视为仅构建时依赖项。

  2. 某些软件包会记录其构建环境的大部分内容,以供引用/调试之用。例如,Perl 存储有关用于编译它的工具的每个小细节,因此所有这些存储路径最终都会被视为运行时依赖项,尽管 Perl 在运行时实际上并不需要它们,但 Nix 无法知道:它只知道 Perl 存储路径引用那些工具。现在,Nixpkgs 维护人员通常会努力清理它,即通过修剪包含安装中所有这些存储路径的日志文件等,但可以肯定的是,数据库中仍然有大量软件包尚未优化到还没有结束。

  3. 假设您想要编译一个不依赖于 PAM 的 openssh 版本。然后,您可以通过覆盖的方式从表达式中删除构建输入,即将通常传递给 openssh 构建函数的 pam 参数替换为 null。为此,请将以下文件存储在 ~/.nixpkgs/config.nix

    {
    packageOverrides = super: let self = super.pkgs; in {
    openssh-without-pam = super.openssh.override {
    pam = null;
    };
    };
    }

    现在通过运行安装该软件包:

    $ nix-env -f "<nixpkgs>" -iA openssh-without-pam

关于nix - Nix 中的构建与运行时依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34769296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com