npm ERR! ERESOLVE unable to resolve dependency tree的解决方法

npm ERR! ERESOLVE unable to resolve dependency tree的解决方法

本文章向大家介绍npm ERR! ERESOLVE unable to resolve dependency tree的解决方法,主要内容包括解决方法、什么是 peerDependency、总结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

执行 npm install 安装命令时报错:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: [email protected]
npm ERR! Found: [email protected]
npm ERR! node_modules/react
npm ERR!   [email protected]"17.x" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer [email protected]"16" from @umijs/[email protected]
npm ERR! node_modules/@umijs/plugin-qiankun
npm ERR!   dev @umijs/[email protected]"^2.27.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 /root/.npm/eresolve-report.txt for a full report.

解决方法
方法一:在命令中增加 --legacy-peer-dep :

npm install --legacy-peer-deps

方法二:直接修改 npm 配置:

方法二:直接修改 npm 配置:

什么是 peerDependency
在 package.json 文件中,存在一个叫做 peerDependencies(对等依赖关系)的对象,它包含了项目里需要的所有的包或用户正在下载的版本号相同的所有的包。

意思就是对等依赖关系指定我们的包与某个特定版本的 npm 包兼容。

对等依赖关系最好的例子就是 React ,一个声明式的创建用户界面的 JS 库。

假设我们现在有一个 HelloWorld 工程,已经在其根目录下的 package.json 文件中的 dependencies 字段里声明了 packageA 作为依赖,而其下面有两个项目 app_A 和 app_B,它们也依赖 packageA。如果我们用 dependencies 而不是 peerDepenedencies 来声明,那么 npm install 安装完项目之后的依赖结构如下:

├── HelloWorld
│   └── node_modules
│       ├── packageA
│       ├── app_A
│       │   └── nodule_modules
│       │       └── packageA
│       └── app_B
│       │   └── nodule_modules
│       │       └── packageA

packageA 依赖包被安装了 3 次,造成了 2 次安装冗余。

而如果采用 peerDepenedency 来下载,就可以避免这个核心依赖库被重复下载的问题。还是上面那个场景,我们在项目 app_A 和 app_B 的 package.json 文件里的 peerDependencies 字段声明一下核心依赖库 packageA,然后在根目录的 package.json 文件里的 dependencies 字段也声明一下 packageA。接着再执行 npm install,生成的依赖结构就会如下所示:

├── HelloWorld
│   └── node_modules
│       ├── packageA
│       ├── app_A
│       └── app_B

packageA 就只会被安装一次。

因此,npm 从版本 v7 开始,install 就默认以 peerDependencies 的方式去下载了:

如果用户在根目录的 package.json 文件里显式依赖了核心库,那么各个子项目里的 peerDepenedencies 声明就可以忽略。

如果用户没有显式依赖核心库,那么就按照子项目的 peerDepenedencies 中声明的版本将依赖安装到项目根目录里。

而方式 2 就会导致一个问题:用户依赖的包版本与各个子项目依赖的包版本相互不兼容,那么就会报错(无法解析依赖树的问题(依赖冲突))让用户自行去修复,因而导致安装过程的中断。(因为是从 npm v7 引入的,因此 npm v3-v6 就不会发生这个错误)。

总结
npm install xxxx --legacy-peer-deps 命令与其说是告诉 npm 要去干什么,不如说是告诉 npm 不要去干什么。

legacy 的意思:遗产/(软件或硬件)已过时但因使用范围广而难以替代的;

而 npm install xxxx --legacy-peer-deps 命令用于绕过 peerDependency 里依赖的自动安装;

它告诉 npm 忽略项目中引入的各个依赖模块之间依赖相同但版本不同的问题,以 npm v3-v6 的方式去继续执行安装操作。

所以其实该命令并没有真的解决冲突,而是忽略了冲突,以“过时”(v3-v6)的方式进行下载操作。

开发工程师一只,也在不断的学习阶段,平时的小经验不定期分享。 希望看我写的文字的人,可以少走弯路 祝工作学习顺利。
博主经验有限,若有不足,欢迎交流,共同改进~ 愿与同在CSDN的你共同进步。

作者 | 甜蜜的小红薯
出品 | 小红薯

猜你喜欢

转载自blog.csdn.net/qq_36836370/article/details/130579623