【问题标题】:How do transitive dependencies work in Python pip?传递依赖如何在 Python pip 中工作?
【发布时间】:2022-02-11 03:58:44
【问题描述】:

我有一个自动机器构建,它安装了一个 Python 包(包 A),其中包含大量依赖项(包 X、Y 和 Z)。包 A 不固定包 X、Y 或 Z 的版本,因此即使我为包 A 固定版本,也有很多次我的构建失败是因为包 X 中的重大更新。

为了解决这个问题,我计划制作一个 requirements.txt 文件,该文件固定 A、X、Y 和 Z 的显式版本(而不仅仅是 A,这就是现在发生的情况)。假设pip 对固定和传递依赖解析有适当的支持,这应该可以工作。

这似乎适用于我当前版本的 pip,但我发现了很多关于 pip 如何处理这些事情的相互矛盾的信息(例如,this thread 与 100 个 cmets 讨论 pip依赖解析不是很好)。

所以我的问题:

  1. pip 中的依赖关系解析如何工作?如果包 A 依赖于 X>=7,并且我的顶级 requirements.txt 指定 X==8,pip 是否有可能安装 X 版本 9,因为它首先查看 A 并尝试获取最新版本传递依赖?
  2. 是否有规范/权威来源描述了pip 中的依赖关系解析如何工作?我能找到的最好的是 this page,但我在网上看到的一些 cmets 使得该页面在涉及传递依赖项时似乎不是 100% 正确。

谢谢!

【问题讨论】:

  • 我也非常有兴趣了解更多关于这方面的信息,如有必要,我会提供一些赏金。

标签: python pip


【解决方案1】:

pip 引入了 new resolver in 20.3,从 21.0 开始,它现在是默认解析器。

新的解析器修复了您在第一个问题中列出的不一致之处,不仅如此。当依赖包不一致时(例如 X>=7 和 X==6),它将一起拒绝安装。

新的解析器基于 resolvelib,因此您可以在那里找到有关算法的详细信息,但 pip 还更新了 docs about dependency resolution 的一些详细信息,例如它们所做的回溯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-28
    • 2021-07-26
    • 2022-01-12
    • 1970-01-01
    • 2013-03-30
    • 2021-04-11
    • 2019-11-04
    • 2018-07-06
    相关资源
    最近更新 更多