Javascript 为什么是一套';一个人的依赖性会影响另一个人

Javascript 为什么是一套';一个人的依赖性会影响另一个人,javascript,node.js,Javascript,Node.js,我有一个文件夹名为project 我使用“artin add”安装两个软件包(antd和antd mobile),它们都有一个依赖项,名称为rc checkbox antd使用“rc复选框”:“~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.5rc checkbox

我有一个文件夹名为
project

我使用“
artin add
”安装两个软件包(
antd
antd mobile
),它们都有一个依赖项,名称为
rc checkbox

antd
使用
“rc复选框”:“~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
文件夹

奇怪的是,无论我先安装哪一个,
antdmobile的2.0.0
rc复选框将安装在
project/node\u模块上。当我运行这个项目时,
antd
使用
rc复选框
哪个版本是2.0.0(应该使用2.1.5),它会导致错误

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

复制自

版本锁定
Thread
在每次安装后生成
Thread.lock
,它将保存已安装软件包的所有版本(正如您可能知道的,软件包也可以有依赖项,依赖项也可以有依赖项),因此它可以建立无限的依赖项树,这可能会导致非常严重的冲突。让我们想象一下这个场景

 - lodash^1
 - super_module@0.0.1
 - - lodash@1.0.0
 - another_module@0.0.01
 - - lodash@1.x.x
想象一下,当另一个模块的维护人员决定让lodash破坏版本
1.2.0
时,可能发生的情况是,
npm
在过去可以获取同一个库的两个不同实例和两个不同版本,这可能会导致极其奇怪的行为。因为你的模块中没有精确的锁(您接受任何semver版本^1.x.x和^2.x.x,这意味着这两个子模块将满足您的要求,但获取不同的版本。Thread将锁定您的
Thread。在向项目中添加新包时锁定
,这意味着当项目中的其他开发人员签出项目时,他也将拥有相同的
Thread.lock
Thread
最终将“模拟”您提交
Thread时安装的软件包状态。另一方面,锁定
NPM
只需满足semver的要求,就可以为两个开发人员获取两个不同的版本(假设及时升级软件包)

版本锁定
Thread
在每次安装后生成
Thread.lock
,它会持久化已安装软件包的所有版本(正如您可能知道的,软件包也可以有依赖项,依赖项也可以有依赖项),因此它可以建立无限的依赖项树,这可能会导致非常严重的冲突。让我们想象一下这种情况

 - lodash^1
 - super_module@0.0.1
 - - lodash@1.0.0
 - another_module@0.0.01
 - - lodash@1.x.x
想象一下,当另一个模块的维护人员决定让lodash破坏版本
1.2.0
时,可能发生的情况是,
npm
在过去可以获取同一个库的两个不同实例和两个不同版本,这可能导致极其奇怪的行为n您的模块(您接受任何semver版本^1.x.x和^2.x.x,这意味着这两个子模块将满足您的要求,但获取不同的版本。Thread将锁定您的
Thread。在向项目中添加新包时锁定
,这意味着当项目中的其他开发人员签出项目时,他也将拥有相同的
Thread.lock
Thread
最终将“模拟”您提交
Thread时安装的软件包状态。另一方面,锁定
NPM
只需满足semver的要求,就可以为两个开发人员获取两个不同的版本(假设及时升级软件包)