pip 升级冲突

问题

目前,当用户要求 pip 升级某个包时,pip 不会考虑已经安装的包。这会导致 pip 用户出现依赖冲突。

跳至建议

研究

我们发布了一个 调查,询问用户如何解决以下场景

假设您有 tea 和 coffee 包,它们具有以下依赖关系

tea 1.0.0 - 依赖于 water<1.12
tea 2.0.0 - 依赖于 water>=1.12
coffee 1.0.0 - 依赖于 water<1.12
coffee 2.0.0 - 依赖于 water>=1.12

您安装了以下包

tea 1.0.0
coffee 1.0.0
water 1.11.0

您要求 pip 升级 tea。pip 应该怎么做?

如果 pip 将 tea 升级到 2.0.0,则 water 也需要升级,从而与 coffee 产生冲突...

我们给用户提供了四个选择

  1. 升级 tea 和 water。显示一条警告消息,说明 coffee 现在具有不满足的依赖关系。

  2. 自动将 coffee 升级到 2.0.0

  3. 不安装任何内容。告诉用户一切都是最新的(因为他们安装的 tea 版本是最新版本,没有冲突)。

  4. 不安装任何内容。显示一条错误消息,说明升级会导致不兼容。

我们允许用户发布自己的解决方案,并询问他们做出决定的原因。

结果

我们总共收到了 693 份回复,其中 407 份回复包含了对为什么某个特定解决方案是最佳的解释。

  • 497 份回复(71.7%)更倾向于选项 4:pip 应该不安装任何内容,并引发一条错误消息

  • 102 份回复(14.7%)更倾向于选项 2:pip 应该升级 package_coffee

  • 79 份回复(11.4%)更倾向于选项 1:pip 应该升级 tea 和 water

  • 15 份回复(2.2%)更倾向于选项 3:pip 应该不安装任何内容,并告诉用户一切都是最新的

从 407 份回答了“为什么”某个特定解决方案是最佳的回复中,出现了以下关键主题

  • “显式优于隐式” - pip 不应该产生用户不理解、未预料到或未同意其发生的“副作用”

  • pip 应该尽一切努力避免引入冲突(pip 不应该“破坏”开发环境)

  • 告诉用户一切都是最新的(选项 3)具有误导性/不诚实

  • pip 可以通过以下方式变得更加灵活

    • 允许用户选择他们想要如何解决问题

    • 允许用户覆盖默认行为(使用标志)

建议

根据这项研究的结果,pip 用户体验团队向开发团队提出了以下建议