npm install 安装依赖时参照 package-lock.json,npm 版本不对导致警告。

问题复现

项目根目录若已存在package-lock.json文件,npm install 时,控制台告警。

  • 若本地 npm 版本低于原本安装生成package-lock.json的人使用的 npm 的版本。

    npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. I'll try to do my best with it!

  • 若本地 npm 版本高于原本安装生成package-lock.json的人使用的 npm 的版本。

    npm WARN old lockfile The package-lock.json file was created with an old version of npm, so supplemental metadata must be fetched from the registry.

但 npm 仍会继续运行以安装依赖,会直接覆盖package-lock.json,按照当前的 npm 版本生成新的一份 lock 文件。


告警原因

package-lock.json文件中的lockfileVersion值不同。

原开发者使用 npm v7/v8(npm v6)安装依赖时生成的package-lock.json文件中的lockfileVersion值为21)。
当其他开发者使用 npm v6(npm v7/v8)去安装依赖时就会发生冲突。

参考文档 npm-Docs-v8-lockfileversion

package-lock.json 没有提供版本:来自 npm v5 之前的 npm 版本的 "古老" shrinkwrap 文件。
1:npm v5和v6使用的 lockfile 版本。
2:npm v7使用的锁文件版本,它向后兼容v1的锁文件。
3:npm v7使用的锁文件版本,没有向后兼容的能力。


解决思路

1. 不解决

因为不解决也会正常安装依赖。
不解决的问题在于:
使用 npm v6 的开发者处理"lockfileVersion": 2的 lock 文件时,会生成"lockfileVersion": 1的 lock 文件,使用 npm v7 的协同开发者接手又会处理生成"lockfileVersion": 2的 lock 文件。导致 git 不断产生新的差异。

2. 解决(自身版本旧)

如果自身的 npm 版本旧,则更新本地全局包到最新 npm i -g npm@latest 或更新到指定版本 npm install -g npm@x.x.x

3. 解决(自身版本新)

思路:向新版本的 npm 指定只使用"lockfileVersion": 1
如果自身的 npm 版本新,则可以通过指定运行的引擎来保持一致,参考文档 npm-Docs-v8-engines 未实现

4. 解决根本问题的最佳整体方案


参考文档

  1. [stackoverflow] Is there any way to fix package-lock.json lockfileVersion so npm uses a specific format?
posted @ 2022-07-11 11:14  zheyi420  阅读(14798)  评论(0编辑  收藏  举报