为什么“npm install”重写package
我刚刚升级到npm @ 5。我现在有一个package-lock.json文件,其中包含package.json中的所有内容。我希望,当我运行npm install
时,将从锁定文件中提取依赖版本以确定应该在我的node_modules目录中安装什么。奇怪的是它实际上最终修改并重写了我的package-lock.json文件。
例如,锁定文件的typescript指定为版本2.1.6。然后,在npm install
命令之后,版本更改为2.4.1。这似乎打败了锁定文件的整个目的。
我错过了什么?如何让npm真正尊重我的锁文件?
回答如下:更新3:正如其他答案所指出的那样,npm ci
命令在npm 5.7.0中引入,作为在CI上下文中实现快速且可重现的构建的另一种方式。有关详细信息,请参阅documentation和npm blog。
更新2:更新和澄清文档的问题是GitHub issue #18103。
更新1:下面描述的行为在npm 5.4.2中得到修复:当前预期的行为在GitHub issue #17979中列出。
原始答案:正如package-lock.json
所讨论的那样,npm 5.1.0的行为发生了变化。您观察到的行为显然是从版本5.1.0开始的npm。
这意味着只要找到issue #16866中依赖项的较新版本,package.json
就可以胜过package-lock.json
。如果要有效地固定依赖关系,现在必须指定没有前缀的版本,例如,您需要将它们编写为package.json
而不是1.2.0
或~1.2.0
。然后^1.2.0
和package.json
的组合将产生可重复的构建。要明确:单独的package-lock.json
不再锁定根级依赖项!
无论这个设计决定是否合适都是有争议的,因此在package-lock.json
对GitHub的混淆导致了持续的讨论。 (在我看来,这是一个值得怀疑的决定;至少issue #17979的名称不再适用。)
还有一个注意事项:对不支持不可变包的注册表也有限制,例如直接从GitHub而不是npmjs提取包时。有关详细说明,请参阅lock
。