我有一个名为project
的文件夹。
我使用“ yarn add
”来安装两个软件包(antd
和antd-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),并且会导致错误。
那为什么会发生这种情况?我认为两个程序包使用相同的另一个程序包,但版本不同应该不会相互影响。
答案 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个不同的版本(假设及时升级包)