为啥 `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上的是正常