“npm ERR! ERESOLVE unable to resolve dependency tree” 的标准答案是加 --legacy-peer-deps。这篇在本机用自己起的小仓库(不访问外网)构造一个真实的 peer 依赖冲突,看错误信息每一块在说什么,两个绕过参数到底装出了什么,有没有区别,以及怎么真正解决冲突。
$ npm install (退出码 1)
npm error code ERESOLVE
npm error ERESOLVE unable to resolve dependency tree
npm error
npm error While resolving: p1@1.0.0
npm error Found: core-lib@2.0.0
npm error node_modules/core-lib
npm error core-lib@"^2.0.0" from the root project
npm error
npm error Could not resolve dependency:
npm error peer core-lib@"^1.0.0" from widget-ui@2.0.0
npm error node_modules/widget-ui
npm error widget-ui@"^2.0.0" from the root project
npm error
npm error Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution.
npm error
npm error
npm error For a full report see:
npm error <tmp>/cache/_logs/<时间>-eresolve-report.txt
失败后 node_modules 里有什么:(没有 node_modules)Found 是树里已有的版本,Could not resolve dependency 是谁要求了冲突的 peer。
$ npm install --legacy-peer-deps
added 2 packages in 139ms
装好的:{'core-lib': '2.0.0', 'widget-ui': '2.0.0'}
$ npm ls
p2@1.0.0 <tmp>/p2
+-- core-lib@2.0.0
`-- widget-ui@2.0.0
package-lock.json 里 widget-ui 条目的 peerDependencies = {'core-lib': '^1.0.0'}不检查 peer 依赖,静默装上,冲突不会再被提示。
$ npm install --force
added 2 packages in 142ms
npm warn using --force Recommended protections disabled.
npm warn ERESOLVE overriding peer dependency
npm warn While resolving: widget-ui@2.0.0
npm warn Found: core-lib@2.0.0
npm warn node_modules/core-lib
npm warn core-lib@"^2.0.0" from the root project
npm warn
npm warn Could not resolve dependency:
npm warn peer core-lib@"^1.0.0" from widget-ui@2.0.0
npm warn node_modules/widget-ui
npm warn widget-ui@"^2.0.0" from the root project
npm warn
npm warn Conflicting peer dependency: core-lib@1.5.0
npm warn node_modules/core-lib
npm warn peer core-lib@"^1.0.0" from widget-ui@2.0.0
npm warn node_modules/widget-ui
npm warn widget-ui@"^2.0.0" from the root project
装好的:{'core-lib': '2.0.0', 'widget-ui': '2.0.0'}
$ npm ls
p3@1.0.0 <tmp>/p3
+-- core-lib@2.0.0
`-- widget-ui@2.0.0
package-lock.json 里 widget-ui 条目的 peerDependencies = {'core-lib': '^1.0.0'}
--legacy-peer-deps 与 --force 各自生成的 package-lock.json(去掉项目名)是否完全相同:True结果和上一个一样,区别是会把冲突作为警告打印出来。
$ npm install
added 2 packages in 140ms
装好的:{'core-lib': '2.0.0', 'widget-ui': '3.0.0'}
$ npm install
added 2 packages in 138ms
装好的:{'core-lib': '1.5.0', 'widget-ui': '2.0.0'}
p4c 的 package.json 里多一段:"overrides": {"widget-ui": {"core-lib": "$core-lib"}}
$ npm install
added 2 packages in 132ms
装好的:{'core-lib': '2.0.0', 'widget-ui': '2.0.0'}
$ npm ls
p4c@1.0.0 <tmp>/p4c
+-- core-lib@2.0.0
`-- widget-ui@2.0.0让版本互相兼容;overrides 是强行指定,不保证能跑。
$ npm install
added 2 packages in 160ms
装好的:{'core-lib': '1.5.0', 'widget-ui': '2.0.0'}
$ npm install --legacy-peer-deps
added 1 package in 131ms
--legacy-peer-deps 时装好的:{'widget-ui': '2.0.0'}
$ npm install
added 2 packages in 133ms
项目里 .npmrc 写了 legacy-peer-deps=true,直接 npm install:{'core-lib': '2.0.0', 'widget-ui': '2.0.0'}
$ npm config get legacy-peer-deps
truenpm 7+ 会自动装 peer 依赖;.npmrc 里写 legacy-peer-deps 等于长期关掉检查。