提供覆盖安装具有冲突依赖项的包

问题

目前,当用户在他们的项目中存在依赖项冲突时,他们可能没有意识到存在问题,因为 pip 会在不引发错误的情况下安装冲突的包。

新的 pip 解析器更加严格,不再允许用户安装具有冲突依赖项的包。

因此,一些用户可能会觉得更新版本的 pip “坏掉了”,因为 pip 拒绝安装冲突的包。

出于这个原因,pip 团队想知道他们是否应该提供一个覆盖选项,允许用户安装冲突的包。

跳到推荐

研究

我们发布了一个调查,介绍如下

想象你拥有茶和咖啡包

茶 1.0.0 依赖于水 <1.12。
咖啡 1.0.0 依赖于水>=1.12

安装茶 1.0.0 和咖啡 1.0.0 将导致冲突,因为它们都依赖于不同版本的水 - 这被称为“依赖项冲突”。

pip 团队最近更改了 pip 解析依赖项冲突的方式。新的实现比以前更加严格:pip 将不再安装存在依赖项冲突的包 - 而是会显示错误。

本次调查的目的是收集关于提供覆盖此行为的方法的反馈。

所有问题都是可选的 - 请提供尽可能多的信息。

然后我们询问用户

  • 如果 pip 应该提供一个覆盖选项,允许用户在存在依赖项冲突的情况下安装包

  • 他们为什么回答是或否

  • 对于回答是的用户,我们询问

    • 他们将在何时使用覆盖选项

    • 他们将以多高的频率使用覆盖选项

    • 如果 pip 不提供覆盖选项,找到解决方法的难易程度

    • 他们更喜欢哪种语法

结果

总共,我们收到了 415 份调查回复。

绝大多数(>70%)的受访者表示,他们希望某种覆盖选项,允许他们在存在依赖项冲突的情况下安装包。尽管他们希望拥有此功能,但大多数受访者表示,如果此功能存在,他们“不常”使用它 - 这表明这是一个高级功能,对日常使用并不重要。然而,由于找到解决方法会很困难或非常困难(>60%),我们建议 pip 应该提供一个覆盖功能(见下文推荐)。

超过一半的受访者表示,pip install tea coffee --ignore-conflicts 是在一次安装多个具有冲突依赖项的包时,此命令的理想语法。在使用 pip install —-ignore-conflicts 命令时,大多数(>48%)的受访者表示,他们希望 pip 安装到冲突依赖项的最新版本。

大多数受访者建议默认安装最新版本更安全,因为最新版本可能包含安全修复或功能,这些修复或功能难以自己复制。他们还相信依赖项在很大程度上是向后兼容的。但是,他们表示,在需要使用冲突包的旧版本的情况下,能够覆盖此默认行为非常重要。

推荐

根据这项研究,我们建议 pip 团队

  • 实现 --ignore-conflicts 选项,允许用户安装具有冲突依赖项的包

  • 确保 --ignore-conflicts 安装冲突包的最新版本。例如,对于冲突包 water<1.1.2water≥1.1.2,pip 应该优先安装 water≥1.1.2

  • 允许用户通过指定冲突包的版本来覆盖此默认行为。例如,pip install tea coffee water==1.1.1 --ignore-conflicts

  • 警告用户,他们使用了 --ignore-conflicts 标志,这可能会导致程序出现意外行为