我最近刚升级到npm@5。我现在有一个包锁。包含package.json中的所有内容的Json文件。我希望,当我运行npm install时,依赖版本将从锁文件中提取,以确定应该在我的node_modules目录中安装什么。奇怪的是,它实际上最终修改和重写了我的包锁。json文件。

例如,锁文件的typescript被指定为2.1.6版本。然后,在执行npm install命令后,版本被更改为2.4.1。这似乎违背了锁文件的全部目的。

我错过了什么?我如何让npm尊重我的锁文件?


当前回答

编辑:“锁”这个名字是一个棘手的名字,它的NPM试图赶上Yarn。这不是一个锁定的文件。包中。Json是一个用户固定的文件,一旦“安装”将生成node_modules文件夹树,然后该树将被写入package-lock.json。所以你看,它是另一种方式-依赖版本将从包拉。Json和包锁。Json应该被称为package-tree.json

(希望这能让我的回答更清楚,在这么多的反对票之后)


一个简单的答案:打包。Json像往常一样有你的依赖项,而package-lock。Json是“一个精确的,更重要的是可复制的node_modules树”(取自NPM文档本身)。

至于这个棘手的名字,它的NPM试图赶上Yarn。

其他回答

更新3:正如其他答案所指出的,npm ci命令在npm 5.7.0中被引入,作为在ci环境中实现快速和可复制构建的额外方式。更多信息请参阅文档和npm博客。


更新2:更新和澄清文档的问题是GitHub issue #18103。


更新1:下面描述的行为在npm 5.4.2中得到了修复:当前预期的行为在GitHub issue #17979中概述。


原答案(5.4.2之前):包锁的行为。Json在NPM 5.1.0中被改变了,在第16866期讨论过。你观察到的这种行为显然是npm 5.1.0版本的意图。

就是那个包裹。Json可以覆盖包锁。每当在package.json中发现一个依赖项的新版本时,就调用Json。如果你想有效地固定依赖项,你现在必须指定不带前缀的版本,例如,你需要把它们写成1.2.0而不是~1.2.0或^1.2.0。然后组合包装。Json和包锁。Json将产生可复制的构建。需要明确的是:package-lock。Json单独不再锁定根级依赖!

无论这个设计决定是好是坏是有争议的,在GitHub上的17979号问题中,有一个正在进行的讨论。(在我看来,这是一个值得怀疑的决定;至少这个名字锁不再适用了。)

另一个边注:对于不支持不可变包的注册表也有限制,例如当你直接从GitHub而不是npmjs.org提取包时。有关进一步的解释,请参阅包锁的文档。

使用新引进的

npm ci

NPM ci承诺为大型团队带来最大的好处。让开发人员能够在包锁上“签名”,从而促进大型团队之间更有效的协作,并且能够准确地安装锁文件中的内容,每个月可以为开发人员节省数十个小时(如果不是数百个小时的话),将团队解放出来,花更多时间构建和发布令人惊叹的东西。

引入npm ci以实现更快、更可靠的构建

我发现在npm 5.7.1的新版本中加入了新的命令npm ci,它将从package-lock安装。json只

The new npm ci command installs from your lock-file ONLY. If your package.json and your lock-file are out of sync then it will report an error. It works by throwing away your node_modules and recreating it from scratch. Beyond guaranteeing you that you'll only get what is in your lock-file it's also much faster (2x-10x!) than npm install when you don't start with a node_modules. As you may take from the name, we expect it to be a big boon to continuous integration environments. We also expect that folks who do production deploys from git tags will see major gains.

在他们的github页面上有一个公开的问题:https://github.com/npm/npm/issues/18712

当开发人员使用不同的操作系统时,这个问题最为严重。

使用npm ci命令代替npm install。

ci代表clean install。

它将基于包锁安装项目依赖项。Json文件,而不是宽大的包。Json文件依赖关系。

它将生成与团队成员相同的构建,并且速度更快。

你可以在这篇博客文章中阅读更多信息: https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable