鼻涕虫;如果 package.json 只指定确切的版本,package-lock.json 是多余的吗?

Npm; is package-lock.json redundant if package.json only specifies exact versions?

我与 npm 的 package.jsonpackage-lock.json 双重性作斗争。我相信这个问题可能会提供有关这些文件如何相互关联的见解:

如果我们定义了一个package.json文件,其中只指定了所有依赖项的确切版本,例如:

...
  "dependencies": {
    "dep1": "1.2.3",
    "dep2": "4.5.6"
  }
...

并且绝不会出现任何模棱两可的版本,例如:

...
  "dependencies": {
    "dep1": "^1.2.3",
    "dep2": "4.5.*"
  }
...

然后 是否还有理由维护一个 package-lock.json 文件? (如果是这样,这是什么原因?)

即使您固定了特定版本的依赖项,package-lock.json 也不是多余的。

package-lock.json 保护您免受传递依赖 - any dependency that is induced by the components that the program references directly.

It describes the exact tree that was generated, such that subsequent installs are able to generate identical trees, regardless of intermediate dependency updates

例如:

  1. A → B
  2. 不是B→A
  3. B→C

那么依赖A→C(根据传递性公理从1和3推导出来)是传递依赖

请注意,B 可以对 C 使用任何非精确版本约束,例如 >= X。所以这可能是当 C 依赖被解决时,每次它可以是 any 版本大于 X。package-lock.json 将保证不是这种情况。