为什么一个包的依赖关系会影响另一个

时间:2019-04-12 06:12:55

标签: javascript node.js

我有一个名为project的文件夹。

我使用“ yarn add”来安装两个软件包(antdantd-mobile),它们都具有一个名为rc-checkbox的依赖项。

antd使用"rc-checkbox": "~2.1.5"

antd-mobile使用"rc-checkbox": "~2.0.0"

运行命令后,project/node_modules有一个2.0.0版本rc-checkbox文件夹,而project/node_modules/antd/node_modules有一个2.1.5 rc-checkbox文件夹。

奇怪的是,无论我先安装哪个,antd-mobile的2.0.0 rc-checkbox都将安装在project/node_module上。当我运行项目时,antd使用的rc-checkbox版本是2.0.0(应该使用2.1.5),并且会导致错误。

那为什么会发生这种情况?我认为两个程序包使用相同的另一个程序包,但版本不同应该不会相互影响。

1 个答案:

答案 0 :(得分:0)

Here复制

版本锁定

yarn在每次安装后生成yarn.lock,该安装将保留已安装软件包的所有版本(您可能知道软件包也可以具有依赖关系,而依赖关系也可以具有依赖关系),因此它可以建立无限的依赖关系树这会导致非常严重的冲突。让我们想象一下这种情况

 - lodash^1
 - super_module@0.0.1
 - - lodash@1.0.0
 - another_module@0.0.01
 - - lodash@1.x.x

想象一下,当another_module的维护者决定颠覆破坏版本1.2.0时,可能发生的情况是,npm在过去可能会获取同一库的2个不同实例,而2个不同的版本可能会导致极其奇怪的行为。因为您的模块中没有确切的锁定(您可以接受任何semver版本^ 1.xx和^ 2.xx,所以这意味着两个子模块都可以满足您的要求,但获取不同的版本。Yarn将锁定您的{{1} }在向项目添加新软件包时,这意味着当项目中的其他开发人员签出项目时,他还将拥有相同的yarn.lock,而yarn.lock最终将“模仿”软件包的状态另一方yarn作出yarn.lock的承诺时,它们的安装方式看起来很满意,并且可以为2个开发人员获取2个不同的版本(假设及时升级包)

相关问题