理解npm legacy-peer-deps 参数标识

大家应该都遇到过这样的错误: unable to resolve dependency tree

image.png

刚开始是根据报错提示给出的解决方案: npm install --legacy-peer-deps ,这个用过很多次了,也解决过大多数场景,但最近一次却栽到了这上面。

为什么会出现 unable to resolve dependency tree ?

简单说, 安装包的依赖出现了不对等 。具体解释看下面:

前几天还和同事聊这个问题:A 依赖了 C,版本是 1.0,B 也依赖了 C,版本是 2.0,那么最终 npm 安装的 C 是 1.0 还是 2.0,甚至说 C 本身就被项目依赖,版本是 4.0,此时安装的又是什么版本或者以上情况 均不处理报错终止安装,当然这些都是假设自己是 npm 的一些设想,从实际结果来看是终止安装。

所以要处理这个问题就会产生一个用来维护依赖版本的东西,这就是 peerDependencies,peerDependencies 叫对等依赖关系,在 npm 7 才允许显示设置的,再此之前应该是默认始终安装(npm 6 的文档是没有 peerDependencies 相关资料的,也没有 legacy-peer-deps 参数标识),但实际情况我用 node 14.x 却没有此错误(node 14 配套的 npm 是 6.x)…

dependencies 和 peerDependencies 有什么区别?

dependencies peerDependencies
描述 项目运行时所需的依赖库 指定我们的包与特定版本的npm包兼容
行为 如果node_modules目录中不存在某个包,则会自动添加该包。 不会自动安装对等依赖项。需要手动修改package.json文件,添加对等依赖项。
使用 包括在最终代码包中 只有在发布自己的包时才能包含

legacy-peer-deps

–legacy-peer-deps 参数是代表忽略 peerDependencies 设置的依赖版本并继续安装 ,这样产生的结果是,所有依赖会被打乱(具体安装策略还不是很清楚),这有时候没问题有时候就会出错,这取决于项目中是否用到了不同版本库的特性,向这次就栽到这上面了 ,很多库版本不一致,导致某些包已经不支持现有代码引用的一些特性而报错。

所以,综上所述, 不要轻易加上 --legacy-peer-deps ,这也是官方的警告⚠️ ** 。**

image.pngimage.png

其他解决办法

  • 使用 --force ,代表强制继续安装。
    –omit=peer 这个倒还没有试过。

总结

总结就是能不用 --legacy-peer-deps的就不用,求其次用 –force