bigywater.tech
常见报错 · 28

npm ERESOLVE unable to resolve dependency tree:--legacy-peer-deps 和 --force 装出的结果与锁文件完全相同,只差一个警告

“npm ERR! ERESOLVE unable to resolve dependency tree” 的标准答案是加 --legacy-peer-deps。这篇在本机用自己起的小仓库(不访问外网)构造一个真实的 peer 依赖冲突,看错误信息每一块在说什么,两个绕过参数到底装出了什么,有没有区别,以及怎么真正解决冲突。

完全相同
--legacy-peer-deps 与 --force 各自生成的 package-lock.json(去掉项目名)是否一致:True
0 个
报错之后 node_modules 里装了几个包(什么都没装)
1.5.0
npm 7+ 自动安装 peer 依赖时选中的 core-lib 版本(满足 ^1.0.0 的最高版本)

怎么读这个报错

实测 · 本机执行输出
    $ 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。

--legacy-peer-deps

实测 · 本机执行输出
    $ 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 依赖,静默装上,冲突不会再被提示。

--force

实测 · 本机执行输出
    $ 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 是强行指定,不保证能跑。

peer 依赖自动安装

实测 · 本机执行输出
    $ 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
      true

npm 7+ 会自动装 peer 依赖;.npmrc 里写 legacy-peer-deps 等于长期关掉检查。

分步演示

依赖冲突
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64;报错文本都是真实复现时原样捕获的(命令行工具统一用 LC_ALL=C 取英文原文,路径换成 );所有服务都是本机上自己起的、只监听 127.0.0.1,不访问外网;计时用 time.perf_counter,数字每次运行会有小幅抖动。本篇用 Node v26.12.0 / npm 11.20.0;包仓库是脚本在本机 127.0.0.1:9611 上现场起的小服务(core-lib 有 1.0.0 / 1.5.0 / 2.0.0,widget-ui 有 2.0.0 与 3.0.0),包都是脚本生成的空壳,npm 没有访问任何外网;每个实验用独立的缓存和用户配置
    • 没有验证:真实的 React / Webpack 等生态包里 ERESOLVE 的常见形态(多层依赖、可选 peer);npm 6 及以前 peer 依赖只是警告的行为;pnpm / yarn 对 peer 冲突的处理;npm 其他版本里报错措辞的差异;overrides 在更复杂的依赖树里的作用范围;package.json 里 peerDependenciesMeta 的 optional 效果
    京ICP备2026067502号-1京公网安备11010502063487号