为什么 `npm install` 会为同一个 `package.json` 文件生成不同的 `package-lock.json` 文件?

goo*_*ion 5 node.js npm package.json npm-install package-lock.json

这是我的package.json文件的相关部分:

  "devDependencies": {
    "ajv": "^6.0.0",
    "webpack": "^4.0.0",
    "websocket": "^1.0.0",
    "bignumber.js": "^7.0.0",
    "decimal.js": "^10.0.0",
    "truffle": "4.1.11",
    "ganache-cli": "6.1.0",
    "solidity-coverage": "0.5.4",
    "ethereumjs-testrpc-sc": "6.1.2",
    "web3": "1.0.0-beta.34"
  }
Run Code Online (Sandbox Code Playgroud)

我在同一台 PC 上的两个不同存储库中有此文件。

当我同时npm install在这些存储库中的每一个中运行时,我package-lock.json在每个存储库中得到一个不同的文件。

这怎么可能?

这是一个可能的线索:

如果我package-lock.json事先删除了该文件,则会npm install因错误而中止。

所以我的问题的答案可能与npm install依赖于现有package-lock.json文件的事实有关。

最初,我package-lock.json在这些存储库中有不同的文件,因为对应的package.json文件不同。

既然我已将package.json其中一个存储库中的文件更改为与另一个存储库中的文件相同,我希望相应的package-lock.json文件也将变得相同。

Tyl*_*nke 5

来自https://docs.npmjs.com/files/package-locks

从概念上讲,npm-install 的“输入”是一个 package.json,而其“输出”是一个完整的 node_modules 树:您声明的依赖项的表示。在理想的世界中,npm 将像纯函数一样工作:相同的 package.json 应该随时生成完全相同的 node_modules 树。在某些情况下,确实如此。但在许多其他情况下,npm 无法做到这一点。这有多种原因:

  • 不同版本的 npm(或其他包管理器)可能已用于安装包,每个版本使用略有不同的安装算法。”

包锁定文件将确保不会因包版本略有不同而出现任何问题,在同一台计算机上同时运行 npm install 并不能保证获取所有依赖项的相同版本。

另一点可以澄清包文件与包锁定文件的不同之处。两个相同的 package.json 文件不保证相同的 node_modules 文件夹结构。但是两个相同的包锁文件将保证完全相同的node_modules 文件结构。