pip wheel 是如何解决传递依赖的?

How does pip wheel resolves transitive dependencies?

当我 运行 pip wheel sentry-sdk 它下载以下 wheel 文件:

  1. certifi-2020.6.20-py2.py3-none-any.whl
  2. sentry_sdk-0.18.0-py2.py3-none-any.whl
  3. urllib3-1.25.10-py2.py3-none-any.whl

其中 sentry_sdk-0.18.0-py2.py3-none-any.whl 是我实际想要使用的库,其他的是该库工作所需的传递依赖项。我知道该文件来自 PyPI 但是我不明白的是 pip wheel 如何选择上述传递依赖项的版本。

更多上下文

我的根本问题是 urllib3 的已解决版本与另一个已经添加到我正在处理的项目的 pex 文件中的版本冲突(我正在使用 Bazel 生成 pex)我'正在考虑降级 urllib3 的版本以匹配我项目的现有版本。查看 setup.py from the sentry-sdk in GitHub 它说它只需要它大于 1.10.0 ("urllib3>=1.10.0") 所以我认为降级会起作用但我想确保避免生产崩溃。

谢谢

pip的当前版本(2020-10-13)does not have a dependency resolver,它会贪婪地选择第一个约束(所以如果urllib3首先遇到unbounded,它会选择最新版本——即使以后的软件包有更严格的要求)

这在 pip 中正在改变,你可以 enable the resolver as an opt-in in pip>=20.2 它将成为未来的默认值(今年晚些时候)