我最近刚升级到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:正如其他答案所指出的,npmci
命令是在NPM5.7.0中引入的,作为在CI上下文中实现快速和可复制的构建的附加方法。有关更多信息,请参阅文档和npm博客。
更新2:更新和澄清文档的问题是GitHub问题#18103。
更新1:下面描述的行为在npm 5.4.2中得到了修复:当前预期的行为在GitHub问题#17979中得到了概述。
原始答案:package-lock.json
的行为在NPM5.1.0中发生了更改,正如问题#16866中所讨论的那样。您观察到的行为显然是npm从5.1.0版开始的意图。
这意味着,只要为package.json
中的依赖项找到更新版本,package.json
就可以覆盖package-lock.json
。如果您想要有效地固定依赖项,现在必须指定不带前缀的版本,例如,您需要将它们写成1.2.0
,而不是~1.2.0
或^1.2.0
。那么package.json
和package-lock.json
的组合将生成可复制的构建。需要明确的是:package-lock.json
不再单独锁定根级依赖项!
这个设计决定是否好是有争议的,在第17979期的GitHub上有一个由这个混乱引起的持续讨论。(在我看来,这是一个值得商榷的决定;至少lock
这个名称不再适用了。)
还有一个附带说明:对于不支持不可变包的注册中心也有一个限制,例如当您直接从GitHub而不是npmjs.org拉取包时。有关更多说明,请参阅此包锁文档。
我发现新版本的npm 5.7.1将使用新命令npm ci
,它只能从package-lock.json
安装
新的npm ci命令仅从您的锁定文件安装。如果您的package.json和您的锁文件不同步,那么它将报告一个错误。
它的工作方式是扔掉node_modules并从头重新创建它。
除了保证您只获得锁文件中的内容之外,它还快得多(2X-10X!)而不是在不使用node_modules启动时安装npm。
正如您可能从名称中所理解的那样,我们期望它对持续集成环境是一个巨大的好处。我们还期望使用git标记进行生产部署的人员将会看到重大的收获。
使用新引入的
npm ci
npm ci承诺给大型团队带来最大的好处。让开发人员能够“签署”一个包锁,可以促进大型团队之间更有效的协作,并且能够准确地安装锁文件中的内容,可能每月节省数十小时甚至数百小时的开发人员时间,使团队能够腾出更多的时间来构建和传送令人惊奇的东西。
介绍NPM CI
以实现更快,更可靠的生成