提问者:小点点

为什么“npm install”要重写package-lock.json?


我最近刚升级到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个答案

匿名用户

更新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.jsonpackage-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以实现更快,更可靠的生成