我的机器上安装了npm版本6。我在package-lock.json
中具有以下内容:
{
"name": "Project",
"version": "0.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"package1": {
"version": "0.1.2"
},
"package2": {
"version": "0.2.2"
}
}
}
每当我运行npm install
时,它都会更新package-lock.json,并且新的联系人就像:
{
"name": "Project",
"version": "0.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"package1": {
"version": "^0.1.2"
},
"package2": {
"version": "~0.2.2"
}
}
}
我希望不将~
tild或上限^
添加到package-lock版本中。我什至没有在npm install
之前添加或删除任何软件包。 Lock
文件很大,因此很难手动维护更改。
出什么问题了?如何安装新软件包而不影响旧版本?
答案 0 :(得分:1)
根据我的理解以及所进行的任何搜索,我可以说,此(package-lock.json
)行为是重构的,以使依赖项的可追溯性更容易,即使在此期间获得一些较大的锁定文件差异也是如此不理想。
package-lock.json
应该是负责使所有内容保持一致的工具和机制,因此对它的信任是不可避免和必要的。
package-lock.json
描述了生成的确切树,因此无论中间依赖项更新如何,后续安装都可以生成相同的树。
例如,package.json
是:
...
"glamor": "^2.10.00"
...
在包锁中,有指向特定版本的链接,例如https://registry.npmjs.org/glamor /-/glamor-2.20.40.tgz 所做的更改仅涉及需求描述的格式。 是:
"requires": {
"glamor": "2.20.40"
}
Became:
"requires": {
"glamor": "^2.0.0"
}
Semver没有中断(2.20.40仍与^ 2.0.0匹配),并且链接仍然存在 软件包版本更新后,该软件包仍将从链接文件中获取(存在旧版本的软件包) 要更新锁定文件中的链接,您必须更改package.json或进行npm更新。有关更多参考,npm issues
比方说,您使用依赖项“ aaa”,“ bbb”和“ ccc”的固定版本。假设他们每个人都像这样依赖'zzz':
aaa取决于zzz@^1.0.0 bbb取决于zzz@^1.1.0 ccc取决于zzz@^1.0.1
即这三个都取决于zzz的范围,而不是确切的版本。
我们假设zzz的最新版本是1.5.0。
在此更改之前和之后,很明显,zzz的解析版本应为1.5.0,因此唯一的区别是package-lock.json的结构和如何记录此子依赖性。
在此之前,锁定文件将显示所有这三个文件都依赖于zzz@1.5.0,并且z的解析版本为1.5.0。
现在,它记录了每个依赖项的实际“原始”依赖项版本(例如^ 1.0.0,^ 1.1.0等),但仍将z的解析版本显示为1.5.0。
然后考虑释放zzz@1.5.1时会发生什么:
之前,锁定文件需要在所有四个位置从z@1.5.0更新到z@1.5.1。
现在,锁定文件仅需要将z的已解析版本更新为1.5.1,而依赖项可以保留^ 1.0.0,^ 1.1.0和^ 1.0.1,因为它们没有更改。< / p>
正如我之前在线程中提到的那样,在两种情况下,您仍然可以获得完全相同的node_modules。新方法的优点是:
您将看到依赖项的实际要求(例如,范围,而不是确切的版本)。以前,您无法确定aaa实际是否确实需要zzz@1.5.0,或者实际上是zzz@^1.0.0。
锁文件中只有四行,而不是四行。流失更少,发生的事情也更清楚。
顺便说一句,yarn使用了与yarn.lock类似的概念。例如这是一个固定@ sindresorhus / is的示例,但它不是从属符号,可观察到的是:
"@sindresorhus/is@0.10.0":
version "0.10.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.10.0.tgz#f42dd6a9d12cd79fa6f53b27cf5bea3a30d2cafa"
dependencies:
symbol-observable "^1.2.0"