首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么"npm安装“重写包-lock.json?

为什么"npm安装“重写包-lock.json?
EN

Stack Overflow用户
提问于 2017-07-10 21:38:49
回答 12查看 378.4K关注 0票数 887

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

例如,锁文件的类型记录被指定为2.1.6版本。然后,在npm install命令之后,版本更改为2.4.1。这似乎辜负了锁文件的全部用途。

我遗漏了什么?如何让npm真正尊重我的锁文件?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 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.jsonpackage-lock.json的结合将产生可重复的构建。需要澄清的是:仅package-lock.json就不再锁定根级依赖项了!

这个设计决策是否正确是值得商榷的,由于GitHub在第17979期上的混淆,正在进行讨论。(在我看来,这是一个值得怀疑的决定;至少lock这个名字不再是真的了。)

还有一点需要注意的是:对于不支持不可变包的注册中心也有限制,例如直接从GitHub而不是npmjs.org中提取包。有关进一步解释,请参见这是包锁的文档

票数 592
EN

Stack Overflow用户

发布于 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标签进行生产部署的人会看到重大的收益。

票数 236
EN

Stack Overflow用户

发布于 2018-12-03 12:39:15

简短回答:

  • 只有当npm install满足package.json的要求时,它才会授予package-lock.json。
  • 如果它不满足这些要求,包将被更新&包锁被覆盖。
  • 如果您希望安装失败,而不是在这种情况下覆盖包锁,请使用npm ci

这里是一个可能解释事情的场景(用NPM6.3.0验证)

您可以在package.json中声明一个依赖项,如:

代码语言:javascript
复制
"depA": "^1.0.0"

然后是npm install,它将生成一个包-lock.json,其中:

代码语言:javascript
复制
"depA": "1.0.0"

几天后,发布了一个较新的次要版本的"depA“,比如"1.1.0",那么以下内容是正确的:

代码语言:javascript
复制
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更新为:

代码语言:javascript
复制
"depA": "^1.1.0"

然后重新运行:

代码语言:javascript
复制
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)
票数 159
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45022048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档