你可能有类似的东西:
"typescript":"~2.1.6"
在您的package.json
which npm 更新到最新的次要版本,在您的情况下2.4.1
编辑:来自OP的问题
但这并不能解释为什么“npm install”会更改锁定文件。锁定文件不是要创建可重现的构建吗?如果是这样,无论 semver 值如何,它仍应使用相同的 2.1.6 版本。
回答:
这旨在锁定您的完整依赖关系树。假设typescript v2.4.1
需要widget ~v1.0.0
。当您 npm install 时,它会抓取widget v1.0.0
. 稍后,您的开发人员(或 CI 构建)执行 npm 安装并获取typescript v2.4.1
但widget
已更新为widget v1.0.1
. 现在你的节点模块不同步了。这就是package-lock.json
阻止。
或更一般地说:
例如,考虑
包一:
{“名称”:“A”,“版本”:“0.1.0”,“依赖项”:{“B”:“<0.1.0”}}
包 B:
{“名称”:“B”,“版本”:“0.0.1”,“依赖项”:{“C”:“<0.1.0”}}
和包C:
{“名称”:“C”,“版本”:“0.0.1”}
如果这些是注册表中唯一可用的 A、B 和 C 版本,则正常的 npm install A 将安装:
A@0.1.0 -- B@0.0.1 -- C@0.0.1
但是,如果 B@0.0.2 已发布,则新的 npm install A 将安装:
A@0.1.0 -- B@0.0.2 -- C@0.0.1 假设新版本没有修改 B 的依赖。当然,新版本的 B 可以包含新版本的 C 和任意数量的新依赖项。如果不希望进行此类更改,则 A 的作者可以指定对 B@0.0.1 的依赖关系。但是,如果 A 的作者和 B 的作者不是同一个人,那么 A 的作者就没有办法在 B 完全没有变化的情况下说他或她不想拉入新发布的 C 版本。
OP 问题 2:所以让我看看我是否理解正确。你说的是lock文件指定了二级依赖的版本,但还是依赖package.json的模糊匹配来确定顶级依赖。那准确吗?
答:不会。package-lock 会锁定整个包树,包括 中描述的根包package.json
。如果typescript
被锁定2.4.1
在您的 中package-lock.json
,它应该保持这种状态,直到它被更改。让我们说明天typescript
发布版本2.4.2
。如果我签出您的分支并运行npm install
,npm 将尊重锁定文件并安装2.4.1
。
更多关于package-lock.json
:
package-lock.json 会为 npm 修改 node_modules 树或 package.json 的任何操作自动生成。它描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖项更新如何。
该文件旨在提交到源存储库中,并用于各种目的:
描述依赖关系树的单一表示,以保证团队成员、部署和持续集成安装完全相同的依赖关系。
为用户提供“时间旅行”到 node_modules 先前状态的工具,而无需提交目录本身。
通过可读的源代码控制差异来促进对树更改的更大可见性。
并通过允许 npm 跳过以前安装的包的重复元数据解析来优化安装过程。
https://docs.npmjs.com/files/package-lock.json