【问题标题】:How does the dependency resolution works with pip when a package specify a range and another doesn't?当一个包指定一个范围而另一个包没有指定范围时,依赖关系解析如何与 pip 一起工作?
【发布时间】:2019-09-13 12:54:07
【问题描述】:

我有一个只有 2 个依赖项的 requirements.txt:

sentry-sdk==0.7.11
requests==2.21.0

我检查了两个包的 setup.py 并且都依赖于 urllib3:

  • 请求提供了一个不接受 1.25 的范围
  • sentry-sdk 没有指定特定的版本或范围

最近发布了一个新版本的urllib3(1.25),当我用pip安装依赖时,我收到以下错误:

ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.

这种行为是预期的还是 pip 中的错误?

install_requires中不指定依赖版本是什么意思? “强制最新版本”?

【问题讨论】:

  • 我也在尝试使用 pipenv(-r 标志)安装依赖项,看起来 pipenv 能够处理依赖项解析。我想我期待 pip 提供的东西实际上并没有提供。显然 pip 只能检测冲突

标签: python pip setuptools install-requires


【解决方案1】:

您观察到这种行为的原因是因为 pip 先安装了sentry-sdk。由于这没有版本约束,因此您将获得最新版本(1.25)。安装requests时,此版本不兼容。

解决此问题的唯一方法是全局解决所有版本约束,这是 AFAIK pip 无法做到的。

解决方案是在你的 requirements.txt 中指定你想要的 urllib3 的版本(因为你知道你使用了哪些版本的依赖)。对于没有限制的临时包来说,这可能是一个很好的做法。

实际上,使用 pip 进行可重现构建的方法是始终这样做

pip freeze > requirements.txt

并检查结果。这样,第三方包更新不会破坏您的构建,您可以随时手动升级(并检查结果)。

【讨论】:

  • 似乎 pip 也有“检查”命令。在冻结之前检查是否有问题可能是个好主意。
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多