将 package-lock.json 配置为依赖项真相的来源

Configuring package-lock.json to be source of dependency truth

我有与 Do I need both package-lock.json and package.json? 完全相同的问题(tldr;“package.jsonpackage-lock.json 之间有什么区别?”)和在那里找到了一些非常好的答案。然而,它给我留下了一些其他非常相似的相关问题,我在其他地方看不到这些问题的答案。

例如,如果package.jsonpackage-lock.json相互冲突怎么办?说 package.json 说要使用 some-lib-2.*some-lib 的任何 2.x 版本)但是 package-lock.json 被配置为使用 some-lib-1.18.4?有错误吗?是否优先选择任一文件作为“依赖性真相的来源”?

我喜欢用一个文件来管理我的特定依赖项的想法,所以我觉得我倾向于

  1. 根本没有在 package.json 中指定库或版本;和
  2. 使用 package-lock.json 指定每个项目的确切版本 module/library 我的项目使用

这可以吗?如果是这样,我需要进行任何特殊配置吗?我是在版本控制中跟踪这两个文件,还是有什么理由让我 不想 想要在 git/VCS 中跟踪这些文件?

  1. 您使用命令行 (npm install [optional args]) 更新两个文件
  2. NPM —— 和你的命令行调用 —— 决定模块的依赖版本的可接受范围,并在 package.json 中定义这些范围。然后它会在该范围内选择一个版本——将其用于 buildtime/runtime——并将该确切版本写入 package-lock.json
  3. 所以您想将这两个文件都放在版本控制中,这样您就有了可重复的构建,并且检查您的项目的任何开发人员都将能够立即构建具有相同依赖项的相同版本的项目
  4. 并且您唯一一次直接编辑 package.json 是在您不想为特定依赖项允许一系列版本并且想要挑选要使用的确切版本时。您进行编辑、保存,您 运行 npm install [options]package-lock.json 也将更新为使用该版本

就其价值而言,这非常令人困惑,并且提倡 而不是 的 anti-pattern 来管理您的依赖项。它允许开发人员认为只引入给定依赖项的最新版本是可以的,即使该版本在构建之间发生变化。这会导致您的应用程序中出现错误,non-repeatable 构建和各种令人头疼的问题。

我强烈建议始终为所有直接依赖项指定所需的确切版本:请不要再使用范围或通配符。