根据我的理解和我在此搜索的任何内容,我可以说,this( package-lock.json
) 行为是重构以使依赖关系的可追溯性更容易,即使同时获得一些大的锁定文件差异并不理想。
package-lock.json
应该是负责保持一切一致的工具和机制,因此对它的信任是不可避免和必要的。
文档
package-lock.json
描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖项更新如何。
例如,package.json
是:
...
"glamor": "^2.10.00"
...
在 package-lock 中,有具体版本的链接,例如https://registry.npmjs.org/glamor ///glamor-2.20.40.tgz 的变化只触及了require描述的格式。它是:
"requires": {
"glamor": "2.20.40"
}
Became:
"requires": {
"glamor": "^2.0.0"
}
Semver 没有损坏(2.20.40 仍然匹配 ^2.0.0),并且链接保持在原地更新包版本时,仍然会从链接文件中取出包(有一个旧版本的包) 要更新锁定文件中的链接,您必须更改 package.json 或进行 npm 更新。更多参考npm 问题
对此的更多解释:
假设您使用依赖项“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 的结构和记录此子依赖项的方式。
之前,lock 文件会显示它们三个都依赖于 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,因为它们没有更改。
正如我之前在线程中提到的,在这两种情况下您仍然会得到完全相同的 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"