我最近刚升级到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安装荣誉包锁。Json,如果它满足package.json的要求。 如果它不满足这些要求,则更新包并覆盖包锁。 如果你希望安装失败,而不是覆盖包锁发生时,使用npm ci。
下面是一个可能解释这些事情的场景(经过NPM 6.3.0验证)
在包中声明一个依赖项。json:
"depA": "^1.0.0"
然后执行npm install,它会生成一个包锁。json:
"depA": "1.0.0"
几天后,“depA”的一个更新的小版本发布了,比如“1.1.0”,那么下面的情况是成立的:
npm ci # respects only package-lock.json and installs 1.0.0
npm install # also, respects the package-lock version and keeps 1.0.0 installed
# (i.e. when package-lock.json exists, it overrules package.json)
接下来,手动更新包。json:
"depA": "^1.1.0"
然后重新运行:
npm ci # will try to honor package-lock which says 1.0.0
# but that does not satisfy package.json requirement of "^1.1.0"
# so it would throw an error
npm install # installs "1.1.0" (as required by the updated package.json)
# also rewrites package-lock.json version to "1.1.0"
# (i.e. when package.json is modified, it overrules the package-lock.json)
其他回答
简短的回答:
NPM安装荣誉包锁。Json,如果它满足package.json的要求。 如果它不满足这些要求,则更新包并覆盖包锁。 如果你希望安装失败,而不是覆盖包锁发生时,使用npm ci。
下面是一个可能解释这些事情的场景(经过NPM 6.3.0验证)
在包中声明一个依赖项。json:
"depA": "^1.0.0"
然后执行npm install,它会生成一个包锁。json:
"depA": "1.0.0"
几天后,“depA”的一个更新的小版本发布了,比如“1.1.0”,那么下面的情况是成立的:
npm ci # respects only package-lock.json and installs 1.0.0
npm install # also, respects the package-lock version and keeps 1.0.0 installed
# (i.e. when package-lock.json exists, it overrules package.json)
接下来,手动更新包。json:
"depA": "^1.1.0"
然后重新运行:
npm ci # will try to honor package-lock which says 1.0.0
# but that does not satisfy package.json requirement of "^1.1.0"
# so it would throw an error
npm install # installs "1.1.0" (as required by the updated package.json)
# also rewrites package-lock.json version to "1.1.0"
# (i.e. when package.json is modified, it overrules the package-lock.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 install检测对包的任何更改。Json文件,以反映相应的依赖列表。
例:如果用户添加或删除了一个新的依赖项,构建将下载或删除本地计算机中的依赖项。我们可以将其与java中的.m2存储库进行比较,其中maven会不断跟踪pom.xml文件以更新依赖项。
package-lock。Json是package的副本。Json在运行时被内部进程使用,唯一的区别是包锁。Json对用户来说是只读的。
也许你应该用这样的东西
npm ci
而不是使用npm install 如果您不想更改包的版本。
根据官方文档,npm install和npm ci都安装了项目所需的依赖项。
主要的区别是,npm install确实使用package来安装包。Json作为引用。在npm ci的情况下,它确实使用package-lock来安装包。Json作为参考,确保每次安装的包都是正确的。
在他们的github页面上有一个公开的问题:https://github.com/npm/npm/issues/18712
当开发人员使用不同的操作系统时,这个问题最为严重。