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

Posted

技术标签:

【中文标题】为啥 `npm install` 会为同一个 `package.json` 文件生成不同的 `package-lock.json` 文件?【英文标题】:Why does `npm install` generate different `package-lock.json` files for the same `package.json` file?为什么 `npm install` 会为同一个 `package.json` 文件生成不同的 `package-lock.json` 文件? 【发布时间】:2018-11-20 19:59:29 【问题描述】:

这是我的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"
  

我在同一台 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 文件也将变得相同。

【问题讨论】:

【参考方案1】:

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

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

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

package-lock 文件将确保不会因软件包版本略有不同而中断,在同一台机器上同时运行 npm install 并不能保证获得所有依赖项的相同版本。

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

【讨论】:

谢谢,但我在这两种情况下都使用了相同的npm 版本(6.1.0)。另外,请参阅我对问题的更新。我有一种感觉,npm install 在某种程度上依赖于package-lock.json 文件作为输入。 @goodvibration 包锁定文件可用作 npm install 的输入。假设我正在开发一个 node.js 应用程序,如果我想招募第二个开发人员,我会给他们我的包锁定文件来安装包,以确保它们运行所有包的完全相同版本。

以上是关于为啥 `npm install` 会为同一个 `package.json` 文件生成不同的 `package-lock.json` 文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 npm install 之后 npm 正在运行准备脚本,我该如何停止它?

为啥 npm install react-native 不起作用?

Centos:$ npm install -g vue-cli module.js:549 为啥任何的npm install均报此错,在window上的是正常

为啥 npm install 在 git bash 上不起作用

为啥`npm install -g` 不适用于 web3?

为啥“npm install”告诉我“没有安装你必须自己安装对等依赖项:”?