我最近刚升级到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 ci命令代替npm install。

ci代表clean install。

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

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

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

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

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

使用新引进的

npm ci

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

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

这个问题在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是你现在安装现有项目时应该使用的命令。