应该如何阅读这个依赖关系表?

应该如何阅读这个依赖关系表?

https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-dependency-reference

当某些其他可传递(非直接)下游依赖项也需要它作为直接依赖项时,就称该依赖项被传播。 [3]

需要注意的是,依赖项不一定以与之前相同类型的依赖项的形式传播,而是以相应的类型传播,以便平台规则仍然保持一致。为了确定依赖关系传播的确切规则,我们首先为每个依赖关系分配几个三进制数字(-1 表示构建,0 表示主机,1 表示目标)表示其依赖关系类型,该类型捕获其主机和目标平台的情况与依赖派生的主机和目标平台的每个“偏移”。下表总结了可以获得的不同组合:

host → target         attribute name          offset
build --> build       depsBuildBuild          -1, -1
build --> host        nativeBuildInputs       -1, 0
build --> target      depsBuildTarget         -1, 1
host --> host         depsHostHost            0, 0
host --> target       buildInputs             0, 1
target --> target     depsTargetTarget        1, 1

我想知道如何阅读该表?

“主机→目标”和“构建-->构建”中的箭头是什么意思?

偏移量是如何计算的?

答案1

在 Nix 包管理的上下文中,包之间的依赖关系可以理解为关系网络。让我们来分解一下:

1. 依赖轴:

  • 平台关系:考虑不同的计算机系统或平台,例如 Windows、Mac 和 Linux。一个程序可能需要不同的东西才能在每个程序上顺利运行。
  • 传播:这就像一个连锁反应。有时,如果包 A 需要包 B,然后包 C 需要包 A,则包 C 也间接需要包 B。

2. 了解主机和目标平台:

  • 主机平台:这就像构建包的本机环境。
  • 目标平台:这是包运行的环境。

3. 表格说明及举例:

假设您正在 Mac(您的主机平台)上构建一个名为“CoolApp”的程序。该程序需要不同的库才能正常工作。该表帮助我们了解需要哪些库以及它们在平台方面的关系。

  • “构建-->构建”(depsBuildBuild,-1,-1):想象一下 CoolApp 需要一些在其构建过程中也使用的特定库。它们就像仅在创建 CoolApp 期间才需要的构建块。

  • “构建-->主机”(nativeBuildInputs,-1,0):这些可能是 CoolApp 构建过程中所需的工具或库,但特定于 Mac 环境。

  • “构建 --> 目标” (depsBuildTarget, -1, 1):这些可能是 CoolApp 构建期间所需的库,用于在不同平台(如 Linux)上运行应用程序。

  • “主机 --> 主机” (depsHostHost, 0, 0):想象一下 CoolApp 需要一些专门用于 Mac 的库才能运行。他们就像同样生活在 Mac 世界中的朋友一样。

  • “主机 --> 目标”(buildInputs, 0, 1):这些可能是 CoolApp 在另一个平台(如 Linux)上运行所需的附加库。

  • “目标 --> 目标” (depsTargetTarget, 1, 1):这些可能是在 Linux 上运行 CoolApp 所需的库,而在 Mac 上的构建过程中可能不需要这些库。

4. 现实世界的影响:

了解这些依赖关系有助于 Nix 包管理器正确设置环境。它确保了当 CoolApp 在 Mac 上构建然后在 Linux 上使用时,它拥有在两个地方顺利运行所需的一切,而不会丢失任何部分。

因此,这张表就像一个路线图,指导包管理器应包含哪些部分(库或依赖项)以及它们在拼图中的位置,以确保 CoolApp 在不同平台上完美运行。

相关内容