20.3(2020 年)中 pip 依赖项解析器的更改¶
pip 20.3 拥有新的依赖项解析器,默认情况下针对 Python 3 用户启用。(pip 20.1 和 20.2 包含新的依赖项解析器的预发布版本,隐藏在可选用户标志后面。)请阅读以下内容,了解迁移指南、如何调用旧版解析器以及弃用时间线。我们还制作了一个时长两分钟的视频解释供您观看。
我们将根据测试人员的反馈继续改进 pip 依赖项解析器。请通过解析器测试调查向我们提供反馈。
注意¶
此版本中最大的变化是 pip 中的 pip 依赖项解析器。
计算机需要知道安装软件组件的正确顺序(“要安装x,您需要先安装y”)。因此,当 Python 程序员将软件共享为包时,他们必须精确地描述这些安装先决条件,并且 pip 需要处理它收到相互冲突的指令时的棘手情况。这个新的依赖项解析器将使 pip 在处理这些棘手的逻辑方面变得更好,并使 pip 更易于使用和排查故障。
解析器中最重要的更改是
它将减少不一致性:它不再安装相互不一致的包组合。在旧版本的 pip 中,pip 可能安装一个不满足另一个已安装包的声明需求的包。例如,在 pip 20.0 中,pip install "six<1.12" "virtualenv==20.0.2" 执行了错误的操作,它“成功”地安装了 six==1.11,即使virtualenv==20.0.2需要six>=1.12.0,<2(此处定义)。新的解析器将直接拒绝安装任何内容,如果它得到该输入。
它将更严格 - 如果您要求 pip 安装两个具有不兼容需求的包,它将拒绝(而不是像以前版本那样安装一个损坏的组合)。
因此,如果您一直在使用解决方法来强制 pip 处理不兼容或不一致的需求组合,现在是修复包中底层问题的好时机,因为从现在起 pip 将更严格。
这也意味着,当您运行 pip install 命令时,pip 仅考虑您在该命令中安装的包,并可能会破坏已安装的包。它不会保证您的环境始终保持一致。如果您pip install x,然后pip install y,您获得的y版本可能与您在一个命令中运行pip install x y时获得的版本不同。我们正在考虑更改此行为(根据#7744),并希望您对 pip 的行为应该是什么给出意见;请回答我们关于导致冲突的升级的调查。
我们还正在更改对约束文件、可编辑安装以及相关功能的支持。我们进行了相当全面的改革,并将约束文件简化为纯粹指定包的全局(版本)限制的方法,因此一些以前允许的组合现在会导致错误。具体来说
约束不会覆盖现有需求;它们只是限制解析器可见的版本作为输入(请参阅#9020)。
提供可编辑需求 (-e .) 不会导致 pip 忽略版本说明符或约束(请参阅#8076),如果您在固定需求和本地目录之间存在冲突,那么 pip 将指示它无法找到满足两者需求的版本(请参阅#8307)。
哈希检查模式要求所有需求都指定为==与版本的匹配,并且可能与约束不兼容(请参阅#9020和#8792)。
如果需要满足约束,pip 将乐于重新安装包,升级或降级,而无需任何额外的命令行选项(请参阅#8115和控制安装过程的选项)。
无名需求不允许作为约束(请参阅#6628和#8210)。
链接不允许作为约束(请参阅#8253)。
约束不能包含扩展 (extras)(请参阅#6628)。
根据我们的Python 2 支持策略,使用 Python 2 的 pip 20.3 用户将默认使用旧版解析器。使用 Python 2 的用户应尽快升级到 Python 3,因为在 2021 年 1 月的 pip 21.0 中,pip 完全放弃了对 Python 2 的支持。
如何升级和迁移¶
使用python -m pip install --upgrade pip安装 pip 20.3。
通过运行pip check验证您当前的环境。这将报告您的已安装包集中是否存在任何不一致。拥有干净的安装将极大地降低您遇到新解析器问题的可能性(并且可能会解决当前环境中隐藏的问题!)。如果您运行pip check并遇到无法解决的问题,请在我们的问题跟踪器或聊天中寻求帮助。
测试新版本的 pip.
虽然我们已尽力确保 pip 的测试套件涵盖了尽可能多的用例,但我们非常清楚,有很多人使用 pip 并采用许多不同的工作流程和构建流程,如果没有您的帮助,我们将无法覆盖所有这些流程。
如果您使用 pip 安装软件,请试用新的解析器,并使用pip install告诉我们它是否对您有效。尝试
同时安装多个包
使用 requirements.txt 文件重新创建环境
使用pip install --force-reinstall检查它是否按预期工作
使用约束文件
以下的“需要特别关注的测试设置”和“尝试的示例”
如果您有一个依赖于 pip 安装依赖项的构建管道,请检查新解析器是否满足您的需求。
使用新解析器运行项目的 CI(测试套件、构建过程等),并告知我们任何问题。
如果您以前遇到过 pip 的解析器问题,请检查新解析器是否已解决这些问题,并阅读 处理依赖冲突。此外,请告知我们新解析器是否对您为解决当前解析器限制而采取的任何解决方法存在问题。我们需要确保人们能够顺利过渡到这些解决方法。
如果您开发或维护一个包装 pip 或使用它来提供部分功能的工具,请测试您的集成与 pip 20.3。
如有必要,进行故障排除并尝试这些解决方法。
如果 pip 安装包需要更长时间,请阅读 依赖解析回溯,了解如何减少 pip 因依赖冲突而进行回溯所花费的时间。
如果您不希望 pip 实际解析依赖项,请使用 --no-deps 选项。当您有一组在现实中可以一起工作的包版本时,即使它们的元数据表明它们存在冲突,这也很有用。有关长期解决方案的指南,请阅读 处理依赖冲突。
如果您遇到解析错误,并且在修复其根本原因时需要解决方法,您可以使用标志 --use-deprecated=legacy-resolver 选择旧的解析器行为。这将一直有效,直到我们发布 pip 21.0(请参阅 弃用时间表)。
请通过 解析器测试调查 报告错误。
需要特别关注的测试设置¶
包含 100 多个包的需求文件
涉及多个需求文件的安装工作流程
包含哈希值 (哈希检查模式) 或固定依赖项(可能作为 pip-tools 内 pip-compile 的输出)的需求文件
使用 约束文件
持续集成/持续部署设置
从任何类型的版本控制系统(即 Git、Subversion、Mercurial 或 CVS)安装,根据 VCS 支持
从本地目录中保存的源代码安装
尝试的示例¶
安装
tensorflow
hacking
pycodestyle
pandas
tablib
elasticsearch 和 requests 放在一起
six 和 cherrypy 放在一起
pip install flake8-import-order==0.17.1 flake8==3.5.0 --use-feature=2020-resolver
pip install tornado==5.0 sprockets.http==1.5.0 --use-feature=2020-resolver
尝试
pip install
pip uninstall
pip check
pip cache
告诉我们¶
我们非常乐意获得有关以下方面的反馈
新解析器产生错误结果的情况,很明显。我们希望不会出现太多这种情况,但我们希望在删除旧解析器之前找到此类错误。
解析器在您认为它应该能够解决问题的情况下产生错误的情况。
解析器因您的需求存在问题而导致错误,但您需要更多信息才能确定错误所在的情况。
如果您有解决方法来解决当前解析器的问题,新解析器是否允许您删除这些解决方法?告诉我们!
请通过 解析器测试调查 告知我们。
弃用时间表¶
我们计划使用 功能标志 并遵循我们的 发布节奏,按照以下步骤进行解析器转换。
pip 20.1:新解析器的 alpha 版本可用,可选择使用可选标志 --unstable-feature=resolver。pip 默认使用旧的行为。
pip 20.2:新解析器的 beta 版本可用,可选择使用标志 --use-feature=2020-resolver。pip 默认使用旧的行为。希望 pip 默认使用新解析器的 pip 20.2 用户可以运行 pip config set global.use-feature 2020-resolver(有关该方法以及备用 PIP_USE_FEATURE 环境变量选项的更多信息,请参阅 问题 8661)。
pip 20.3:在 Python 3 环境中,pip 默认使用新解析器,但用户可以选择退出并选择旧的解析器行为,使用标志 --use-deprecated=legacy-resolver。在 Python 2 环境中,pip 默认使用旧解析器,可以使用标志 --use-feature=2020-resolver 使用新解析器。
pip 21.0:pip 默认使用新解析器,旧解析器不再受支持。它将在目前尚未确定的时间段后删除,因为删除时间取决于 pip 的志愿维护者的可用性。根据我们的 Python 2 支持 策略,Python 2 支持将被移除。
由于此工作不会更改 pip 文档中描述的用户可见行为,因此此更改不受 弃用策略 的约束。
注意
旧解析器已弃用且不受支持。新功能,如 安装报告,将无法与旧解析器一起使用,并且该解析器将在将来的版本中删除。
上下文和后续操作¶
正如 我们在 PSF 博客上发布的公告 中所讨论的,pip 团队正在开发一个新的“依赖解析器”(pip 中用于根据您的需求确定要安装内容的部分)。
我们在 #6536 中跟踪我们的发布过程,您可以在 流量较少的打包发布列表 和 官方 Python 博客 上关注我们的发布公告。
使用系统信任库验证 HTTPS
现在已包含在 HTTPS 证书 中。