“npm i --package-lock-only”是什么意思?

43
npm i --package-lock-only是什么意思?文档缺少示例。如果我在本地的node_modules文件夹中有旧的包且没有package-lock.json文件,那么npm i --package-lock-only会根据本地node_modules文件夹中的版本生成一个package-lock.json,还是会生成一个与npm注册表中发布的package.json中的semver范围一致的新版本的package-lock.jsonhttps://docs.npmjs.com/cli/v6/configuring-npm/package-locks
3个回答

38
它将使用 "package.json" 确定要安装的软件包版本,然后如果没有“package-lock.json”文件,则创建一个包含其已解决的版本,或覆盖现有文件。

值得注意的是,它实际上不会安装任何东西,这是与常规的 "npm install"(或别名为 "npm i")区分开来的地方。


1
如果没有 package-lock.jsonnpm i 会创建它吗(当然还会安装 node_modules)? - Justin
@Justin,是的 npm i 会创建锁定文件。 - lfender6445
1
对于那些想知道为什么要使用这个命令的人:您可以运行此命令来自动解决您的package-lock.json中的合并冲突。请参见:https://tkdodo.eu/blog/solving-conflicts-in-package-lock-json - Creative

14

嗯,@Ben Wheeler 是正确的,但是有一个地方需要介绍一下这个过程的背景。

在常规情况下,package-lock 旨在设置应用程序中每个包及其依赖项的完整依赖树,因此不同机器上的每个开发人员都将拥有完全相同的树。

这很重要,因为依赖包可能会随着时间的推移而更新,如果每个开发人员使用不同的版本,可能会破坏您的应用程序。因此,每次执行 npm i 时,如果您有 package.lock.json,则实际上会从那里安装软件包,而不是从 package.json 安装。

有时,当开发人员遇到依赖错误时,他们倾向于删除锁定文件和 node_modules,但这并不总是最好的选择。大多数情况下,只需使用标志 --package-lock-only 更新锁定文件以反映 package.json,然后可以再次运行 npm i 来安装软件包。

锁定文件应提交到您的项目存储库中,以便每个人都可以使用它来获得相同的软件包版本。


1
语义细节(这可能已经清楚大多数人):只是想指出包不是从锁文件中安装的;包仍然是从注册表(或缓存)中安装的。更准确地说,包版本是从锁文件中解析的。文档有一个易于跟随的示例,请参见https://docs.npmjs.com/cli/v6/configuring-npm/package-locks。 - chipit24
1
chipit24 - 我刚刚读到,当有人手动更新package.json文件时,包将根据package.json进行解析,并且package-lock.json文件将被重新编写以匹配。这是真的吗?如果是,那么只有在这种情况下运行npm install才不会遵守package-lock.json吗?我正在尝试发现在ci构建过程运行npm i时减少生产系统风险的最佳策略。它应该运行不同的东西吗?有什么权衡?我之所以问,是因为您似乎在这方面很有知识。 - MattoMK
首先感谢您的留言。当您更新package.json时,package-lock.json也会更新,但我认为它不仅限于手动操作,因为它会比较两个文件,如果跟踪到更改,则会更新锁定文件。我不确定我是否理解了锁定文件背后的所有机制。例如,当我尝试在React Native应用程序中更新锁定文件时,我遇到了意外的行为,最终删除了该文件。在React中,我从未遇到过这样的问题,因此我认为这必须是他们在配置Native版本时出现了一些小错误。我对本地化并不是很熟悉。 - Eran Or

0

package-lock.json 是在 npm 修改 node_modules 树或 package.json 时自动生成的。它描述了生成的确切树,使得后续的安装能够生成相同的树,而不受中间依赖更新的影响。

该文件旨在提交到源代码库,并具有以下各种用途:

  • 描述单个依赖树的表示形式,以便团队成员、部署和持续集成能够保证安装完全相同的依赖项。
  • 为用户提供“时间旅行”到先前状态的 node_modules 的功能,而无需提交目录本身。
  • 通过可读的源代码控制差异促进更大的树变更可见性。
  • 通过允许 npm 跳过先前安装的软件包的重复元数据解析来优化安装过程。
  • 从 npm v7 开始,锁定文件包括足够的信息来获得完整的软件包树图,减少了阅读 package.json 文件的需要,并允许显着提高性能。

参考文献:https://docs.npmjs.com/cli/v7/configuring-npm/package-lock-json - Nirajan Mahara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接