我该如何理解依赖传播?

我该如何理解依赖传播?

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

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

“下游”和“上游”依赖是什么意思?

什么是“非直接”和“直接”依赖?

依赖关系的概念是否传播了包的依赖关系之间的依赖关系?

你能用例子或图表解释一下吗?

答案1

“下游”和“上游”依赖是什么意思?

如在MC68020的回答,我将使用包 A、B 和 C,其中 A 依赖于 B,而 B 又依赖于 C:

A → B → C(依从关系而言)。

“上游”和“下游”术语指的是变化的流。

  • 一般来说,在分发环境中,“上游”通常指的是包中提供的项目的原始源:在那里进行更改,然后更新包以提供更新的项目。

  • 具体来说,在依赖关系的上下文中,如果 C 发生变化,那么 B 可能需要更改,然后 A 可能需要更改。因此C是B的上游依赖,B是A的上游依赖; A是B的下游依赖,B是C的下游依赖。

什么是“非直接”和“直接”依赖?

直接依赖是指直接依赖:B 是 A 的直接依赖,C 是 B 的直接依赖。 非直接依赖是传递依赖:C 是 A 的非直接依赖,因为 A 仅依赖于 C,因为B. 如果将 A 更改为不再依赖于 B,那么它也将不再依赖于 C。

依赖关系的概念是否传播了包的依赖关系之间的依赖关系?

传播依赖关系反映变化在依赖树中。从...开始

A → B → C

上面,如果将 A 更改为使用 C 的某些功能,那么它就会直接依赖于 C:

A → B → C
A → C

从 C 的角度来看,它以前的非直接依赖项 A 现在需​​要它作为直接依赖项,因此依赖项已经“传播”。传播不依赖于 C 或依赖树,它是 A 中更改的结果。

注意这些变化很重要,因为它们可能会被忽视。由于 B 对 C 的依赖,A 可以“免费”访问 C 的功能;因此,当 A 开始直接使用 C 时,不需要更改包装,并且 A 会照常继续构建。然而,A 中的直接依赖项列表现在不完整,如果 B 后来放弃对 C 的依赖,A 将停止构建,即使 A 中没有任何更改。

答案2

简单来说,A、B、C 分别代表 A 包、B 包、C 包。

如果A依赖于B,则意味着A中的某些代码获取了B中定义的一些外部引用。

让 A 依赖于 B,A 本身又依赖于 C。

对于B,A可以说上游(有的也称A为向后依赖B)和C的下游

B 可以说是即时A 的依赖。
但是因为 B 依赖于 C,所以 C 可以说是一个非直接的 A 的依赖性,因为在这种精确情况下,C 没有定义 A 的任何一个外部引用。 A 取决于 C 的每一个优点及物性(在数学意义上A ->(与B -> C => A -> C有某种关系)

现在让我们假设 A 也依赖于 C。您可以将 glibc 视为最常见的示例。 (因为当 A 依赖的其他库也依赖于 glibc 时,A 的某些代码很可能会调用某些 glibc 函数。

然后,C 就会成为 A 和 B 的直接依赖项。在这种情况下,对 C 的依赖项称为传播的

可能会出现困难的情况并导致一些

晦涩/令人困惑

计算演算:当 A -> B -> C -> D -> B

B,A 的直接依赖,也是 D 的直接依赖,而 D 是 B 的非直接依赖。这导致(如 OP 中链接的页面引用)

依赖关系的传递闭包

相关内容