当一个包指定范围而另一个没有指定范围时,依赖项解析如何与 pip 一起工作?
How does the dependency resolution works with pip when a package specify a range and another doesn't?
我有一个 requirement.txt 只有 2 个依赖项:
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中不指定依赖项的版本是什么意思? "force the latest version"?
您观察到此行为的原因是 pip 首先安装 sentry-sdk
。由于这没有版本限制,您将获得最新版本 (1.25)。待安装requests
时,此版本不兼容
解决这个问题的唯一方法是全局解决所有版本约束,这是 AFAIK pip 无法做到的。
解决方案是在 requirements.txt 中指定您想要的 urllib3 版本(因为您知道您使用的依赖项的版本)。对于没有约束的瞬态包来说,这可能是个好习惯。
实际上,使用 pip 进行可重现构建的方法是始终执行
pip freeze > requirements.txt
并检查结果。这样第三方包更新就不会破坏您的构建,您以后可以随时手动升级(并检查结果)。
我有一个 requirement.txt 只有 2 个依赖项:
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中不指定依赖项的版本是什么意思? "force the latest version"?
您观察到此行为的原因是 pip 首先安装 sentry-sdk
。由于这没有版本限制,您将获得最新版本 (1.25)。待安装requests
时,此版本不兼容
解决这个问题的唯一方法是全局解决所有版本约束,这是 AFAIK pip 无法做到的。
解决方案是在 requirements.txt 中指定您想要的 urllib3 版本(因为您知道您使用的依赖项的版本)。对于没有约束的瞬态包来说,这可能是个好习惯。
实际上,使用 pip 进行可重现构建的方法是始终执行
pip freeze > requirements.txt
并检查结果。这样第三方包更新就不会破坏您的构建,您以后可以随时手动升级(并检查结果)。