npm resolution error

2023-01-12 · 538 chars · 3 min read

直说问题,昨天遇到一个 npm 安装失败的问题,报错信息如下:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR!
npm ERR! While resolving: @scope/[email protected]
npm ERR! Found: [email protected]
npm ERR! node_modules/react-router
npm ERR!   react-router@"5.2.1" from [email protected]
npm ERR!   node_modules/react-router-dom
npm ERR!     react-router-dom@"^5.0.0" from the root project
npm ERR!     peer react-router-dom@"^5.2.0" from @scope/[email protected]
npm ERR!     node_modules/@scope/yyy
npm ERR!       @scope/yyy@"3.0.9-alpha.0" from the root project
npm ERR!     2 more (@scope/zzz, @scope/zzz)
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react-router@"^4.3.1" from @scope/[email protected]
npm ERR! node_modules/@scope/xxx
npm ERR!   @scope/xxx@"^2.0.0" from the root project
npm ERR!
npm ERR! Conflicting peer dependency: [email protected]
npm ERR! node_modules/react-router
npm ERR!   peer react-router@"^4.3.1" from @scope/[email protected]
npm ERR!   node_modules/@scope/xxx
npm ERR!     @scope/xxx@"^2.0.0" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR!
npm ERR! See /Users/keenwon/.npm/eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/keenwon/.npm/_logs/2023-01-12T03_35_12_275Z-debug-0.log

这个项目别的同事运行是没有问题的,我运行就报错,后来发现是我使用了 node 16 + npm 8,而其他同事用的是 node 14 + npm 6。

问题的核心是:「多个包有相同的 peerDependencies,但是版本不一致」,这个在 npm 6 里都可以正常使用,但是比较新的 npm 会视为异常,导致安装失败。

解决方案其实在报错信息中已经有了,使用 --force 或者 --legacy-peer-deps。或者更直接的方案是检查相关包的 peerDependencies 是否准确。实在不行也可以考虑切回 node 14。

这不是什么大问题,遇到就随手记录下。

最后想说的是,其实目前主要使用的开源包质量还都比较高,一般不会出现这种依赖混乱的情况,Changelog 也都很清晰。我遇到的出问题的包都是内部的私有包,缺少必要的维护,质量参差不齐。外加项目多如牛毛,升级版本都是本着「能跑就行」的态度,并不会统一协调,按计划整体升级。所以多版本并存,和类似的混乱情况,其实才是企业化开发的常态?也许「可维护」才是「降本增效」该解决的问题?

赞赏

微信