我最近刚升级到npm@5。我现在有一个包锁。包含package.json中的所有内容的Json文件。我希望,当我运行npm install时,依赖版本将从锁文件中提取,以确定应该在我的node_modules目录中安装什么。奇怪的是,它实际上最终修改和重写了我的包锁。json文件。
例如,锁文件的typescript被指定为2.1.6版本。然后,在执行npm install命令后,版本被更改为2.4.1。这似乎违背了锁文件的全部目的。
我错过了什么?我如何让npm尊重我的锁文件?
我最近刚升级到npm@5。我现在有一个包锁。包含package.json中的所有内容的Json文件。我希望,当我运行npm install时,依赖版本将从锁文件中提取,以确定应该在我的node_modules目录中安装什么。奇怪的是,它实际上最终修改和重写了我的包锁。json文件。
例如,锁文件的typescript被指定为2.1.6版本。然后,在执行npm install命令后,版本被更改为2.4.1。这似乎违背了锁文件的全部目的。
我错过了什么?我如何让npm尊重我的锁文件?
当前回答
使用新引进的
npm ci
NPM ci承诺为大型团队带来最大的好处。让开发人员能够在包锁上“签名”,从而促进大型团队之间更有效的协作,并且能够准确地安装锁文件中的内容,每个月可以为开发人员节省数十个小时(如果不是数百个小时的话),将团队解放出来,花更多时间构建和发布令人惊叹的东西。
引入npm ci以实现更快、更可靠的构建
其他回答
在他们的github页面上有一个公开的问题:https://github.com/npm/npm/issues/18712
当开发人员使用不同的操作系统时,这个问题最为严重。
将来,您将能够使用——from-lock-file(或类似的)标志仅从包锁安装。Json而不修改它。
这对于CI等环境非常有用,因为这些环境中可复制的构建非常重要。
有关该特性的跟踪,请参见https://github.com/npm/npm/issues/18286。
Npm install检测对包的任何更改。Json文件,以反映相应的依赖列表。
例:如果用户添加或删除了一个新的依赖项,构建将下载或删除本地计算机中的依赖项。我们可以将其与java中的.m2存储库进行比较,其中maven会不断跟踪pom.xml文件以更新依赖项。
package-lock。Json是package的副本。Json在运行时被内部进程使用,唯一的区别是包锁。Json对用户来说是只读的。
这个问题在npm v5.4.2中被修复了
https://github.com/npm/npm/issues/17979
(向下滚动到线程中的最后一条评论)
更新
在5.6.0中修正。在5.4.2中有一个跨平台的错误,导致这个问题仍然发生。
https://github.com/npm/npm/issues/18712
更新2
请看我的回答: https://stackoverflow.com/a/53680257/1611058
NPM ci是你现在安装现有项目时应该使用的命令。
编辑:“锁”这个名字是一个棘手的名字,它的NPM试图赶上Yarn。这不是一个锁定的文件。包中。Json是一个用户固定的文件,一旦“安装”将生成node_modules文件夹树,然后该树将被写入package-lock.json。所以你看,它是另一种方式-依赖版本将从包拉。Json和包锁。Json应该被称为package-tree.json
(希望这能让我的回答更清楚,在这么多的反对票之后)
一个简单的答案:打包。Json像往常一样有你的依赖项,而package-lock。Json是“一个精确的,更重要的是可复制的node_modules树”(取自NPM文档本身)。
至于这个棘手的名字,它的NPM试图赶上Yarn。