提供覆盖安装具有冲突依赖项的包¶
问题¶
目前,当用户在他们的项目中存在依赖项冲突时,他们可能没有意识到存在问题,因为 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.2
和water≥1.1.2
,pip 应该优先安装water≥1.1.2
。允许用户通过指定冲突包的版本来覆盖此默认行为。例如,
pip install tea coffee water==1.1.1 --ignore-conflicts
警告用户,他们使用了
--ignore-conflicts
标志,这可能会导致程序出现意外行为