我最近刚升级到npm@5,现在我有了一个包-lock.json文件,它包含package.json的所有内容。我希望,当我运行npm install时,依赖关系版本将从锁文件中提取,以确定应该在我的node_modules目录中安装什么。奇怪的是,它实际上最终修改和重写了我的package-lock.json文件。
例如,锁文件的类型记录被指定为2.1.6版本。然后,在npm install命令之后,版本更改为2.4.1。这似乎辜负了锁文件的全部用途。
我遗漏了什么?如何让npm真正尊重我的锁文件?
发布于 2017-08-08 11:16:35
更新3:作为其他答案也指出,在NPM5.7.0中引入了npm ci命令,作为在CI上下文中实现快速和可重复构建的附加方法。有关更多信息,请参见文档和npm博客。
更新2:要更新和澄清文档的问题是GitHub问题#18103。
更新1:下面描述的行为在NPM5.4.2中得到了修正:当前打算的行为概述在GitHub问题#17979中。
最初的回答(前5.4.2):,package-lock.json的行为在npm 5.1.0中发生了变化,正如第16866期中所讨论的那样。您所观察到的行为显然是npm在5.1.0版时的意图。
这意味着,只要在package.json中找到一个新版本的依赖项,package-lock.json就可以重写package.json。如果要有效地锁定依赖项,现在必须指定没有前缀的版本,例如,您需要将它们写为1.2.0而不是~1.2.0或^1.2.0。然后,package.json和package-lock.json的结合将产生可重复的构建。需要澄清的是:仅package-lock.json就不再锁定根级依赖项了!
这个设计决策是否正确是值得商榷的,由于GitHub在第17979期上的混淆,正在进行讨论。(在我看来,这是一个值得怀疑的决定;至少lock这个名字不再是真的了。)
还有一点需要注意的是:对于不支持不可变包的注册中心也有限制,例如直接从GitHub而不是npmjs.org中提取包。有关进一步解释,请参见这是包锁的文档。
发布于 2018-02-27 15:10:21
我发现将有一个新版本的npm 5.7.1和新命令npm ci,它将只从package-lock.json安装
新的npm命令仅从锁文件中安装。如果您的package.json和锁文件不同步,那么它将报告一个错误。 它的工作方式是丢弃node_modules并从头开始重新创建它。 除了保证您只获得锁文件中的内容之外,它也要快得多(2x-10x!)而不是从node_modules开始安装。 正如您可能从名称中得到的,我们期望它对持续集成环境是一个巨大的好处。我们还期望那些通过git标签进行生产部署的人会看到重大的收益。
发布于 2018-12-03 12:39:15
简短回答:
npm install满足package.json的要求时,它才会授予package-lock.json。npm ci。这里是一个可能解释事情的场景(用NPM6.3.0验证)
您可以在package.json中声明一个依赖项,如:
"depA": "^1.0.0"然后是npm install,它将生成一个包-lock.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)接下来,手动将package.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)https://stackoverflow.com/questions/45022048
复制相似问题