为什么“ npm install”会重写package-lock.json?

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

例如,锁定文件的TypeScript指定为版本2.1.6。然后,在npm install命令之后,版本更改为2.4.1。这似乎破坏了锁定文件的全部目的。

我想念什么?如何让npm真正尊重我的锁定文件?

猿阳光2020/03/16 14:37:59

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

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

LEY老丝樱2020/03/16 14:37:59

编辑:名称“锁”是一个棘手的人,其NPM试图赶上纱线。它不是一个锁定的文件。package.json是用户固定的文件,“安装”后将生成node_modules文件夹树,然后将该树写入package-lock.json因此,您将看到相反的结果-依赖关系版本将package.json一如既往地被删除package-lock.json应调用package-tree.json

(希望经过这么多次否决后,我的回答才能更加清晰)


一个简单的答案:package.json像往常一样保持依赖关系,而这package-lock.json是“一个精确的,更重要的是可重现的node_modules树”(取自npm docs本身)。

至于棘手的名称,其NPM试图赶上Yarn。

小胖Stafan2020/03/16 14:37:59

看来此问题已在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 是现在安装现有项目时应使用的命令。

小胖Stafan2020/03/16 14:37:59

使用npm ci命令代替npm install

“ ci”代表“持续集成”。

它将基于package-lock.json文件而不是宽松的package.json文件依赖项安装项目依赖项。

它会为您的队友生成相同的版本,并且速度也更快。

您可以在此博客文章中阅读有关此内容的更多信息:https : //blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable

神无LEYMandy2020/03/16 14:37:59

将来,您将能够使用--from-lock-file(或类似的)标志仅从进行安装,而package-lock.json无需对其进行修改。

这对于CI等可重现构建很重要的环境很有用。

请参阅https://github.com/npm/npm/issues/18286以跟踪功能。

番长小哥理查德2020/03/16 14:37:59

使用新推出的

npm ci

npm ci承诺将为大型团队带来最大的利益。使开发人员能够“退出”软件包锁定功能可以促进大型团队之间更有效的协作,并且完全安装锁定文件中的内容的功能可以每月节省数十甚至数百个开发人员的时间,从而释放团队花更多的时间来建造和运送令人惊奇的东西。

引入npm ci更快,更可靠的构建

Harry小小2020/03/16 14:37:59

我发现将会有一个新版本的npm 5.7.1和新命令npm ci,它将package-lock.json仅从

新的npm ci命令仅从锁定文件安装。如果您的package.json和锁定文件不同步,则它将报告错误。

它可以通过丢弃您的node_modules并从头开始创建它来工作。

除了保证您仅获得锁定文件中的内容外,如果不使用node_modules进行启动,它也比npm install快得多(2x-10x!)。

您可能会从名称中得知,我们希望它对持续集成环境大有裨益。我们还希望从git标签进行生产部署的人们会从中受益匪浅。

泡芙小卤蛋Tom2020/03/16 14:37:59

简短答案:

  • npm install 仅当满足package.json的要求时,才尊重package-lock.json。
  • 如果不满足这些要求,则更新软件包并覆盖软件包锁定。
  • 如果您宁愿使构建失败,也不愿在发生这种情况时重写package-lock,请使用npm ci

这是一个可以解释问题的方案(已通过NPM 6.3.0验证)

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

"depA": "^1.0.0"

然后,您将执行以下操作,npm install将生成一个package-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)