npm install——legacy-peer-deps到底做什么?什么时候推荐/什么是一个潜在的用例?

刚刚遇到了这个错误:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: nexttwin@0.1.0
npm ERR! Found: react@17.0.1
npm ERR! node_modules/react
npm ERR!   react@"17.0.1" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^16.8.0" from react-hook-mousetrap@2.0.4
npm ERR! node_modules/react-hook-mousetrap
npm ERR!   react-hook-mousetrap@"*" from the root project
npm ERR!

我试图安装的模块似乎与我已经安装的模块有不同的对等依赖关系。似乎npm改变了它在这方面的行为,现在让安装失败。

我现在能做些什么来弥补呢?我不想因此而降低我的React版本。

我知道有一个叫--legacy-peer-deps的标志,但我不确定这到底是什么,是否建议使用它/潜在的缺点是什么?我认为npm让安装失败是有原因的。

这只是奇怪,因为我一直在使用yarn,直到最近,一切都很好。

264487 次浏览

下面是我解决这个问题的方法:

首先,发生了什么: react-hook-mousetrap正在寻找react@16.8.0,但它没有找到它。相反,它会找到@react17.0.1,这是一个更新的版本。出于某种原因,mousetrap不喜欢这个更新的版本,并且您正在被通知(这不是一个大问题,但他们认为值得停止您的构建)。

一个解决办法:强制安装老鼠夹想要的特定版本的反应:

yarn add react@16.8.0

这样做的目的是将react版本回滚到与mousetrap兼容的稍微旧一点的版本。您不会注意到任何不同,在未来的迭代中,希望mousetrap会得到更新,这样就不会出现这种情况。

另一个解决方案:做出了一个全面的决定,不安装任何旧版本的依赖:

npm add xxxx --legacy-peer-deps

这样做的目的是忽略这个包的旧依赖项。它更全面,能为你做很多决定。

TL;博士:

如果你从NPM v6 / Node v12升级,你可能会得到这个答案。

  • NPM v7+安装peerDependencies 默认情况下;这是以前版本的NPM的情况。
  • NPM模块必须为它们的peerDependencies命名特定版本
  • 如果你已经安装了一个peerDependency,但没有使用模块命名的版本,那么NPM v7+将抛出一个错误
  • 添加--legacy-peer-deps忽略了这个新需求,冒着引入破坏性更改的风险

——legacy-peer-deps恢复从NPM v4到v6的peerDependency安装行为

一种看待这面旗帜的方式是,它并没有做什么新的事情;相反,它告诉NPM 做一些新的事情,因为NPM v7 现在默认安装peerDependencies

在许多情况下,这会导致版本冲突,从而破坏安装过程。

--legacy-peer-deps标志在v7中被引入,作为绕过peerDependency自动安装的一种方式;它告诉NPM忽略对等deps并继续安装。这就是NPM v4到NPM v6以前的情况。

如果你不清楚普通deps和同行deps之间的区别,这里有一些上下文:

依赖关系vs peerDependencies

NPM模块需要的库或模块。(示例:我最近构建了一个饼图模拟库,使用Chance.js计算指定范围内的随机数;因此Chance是我的模块的依赖。)

peerDependencies:对等依赖项是第三方软件库的特定版本或版本集。它们在概念上类似于浏览器扩展和浏览器之间的关系。(例如:react-redux有两个相当逻辑的peerDependencies: reactredux。)

这个问题在某种程度上是由React v17+引起的

由于大量的模块没有特别添加React v17(或最近的React 18)作为peerDependency,现在在v17 React应用程序中运行npm安装时,遇到unable to resolve dependency tree错误是很常见的。

当一个模块(或它自己的任何依赖项)将以前的主要React版本列为peerDependency而没有具体包括 React v17时,这个错误将被触发。

类似的行为将发生在任何其他框架或库的主版本更新中。)

如何检查任何给定模块的peerDependencies

NPM本身不会在给定模块的页面上列出对等deps。但是,有一个简单的解决方法可以在安装之前或之后检查对等dep。简单地运行:

npm info name-of-module peerDependencies

该命令将返回每个peerDependency的名称以及所有兼容版本。

我解决了(用yarn)添加以下到package.json

"resolutions": {
"**/react": "17.0.2",
"**/react-dom": "17.0.2"
},

如果你不想阻止安装旧的依赖项,你可以通过强制你正在运行的脚本来让npm忽略这些警告。--force

--leagcy-peer-deps跳过所有对等依赖项的安装,并给出关于对等dep的警告,以提醒开发人员手动安装它们。当遇到对等deps冲突时,除了--legacy-peer-deps,另一种选择是使用--force。< br > 处理peer deps冲突的正式文档是

< p >注。< br > 修正上面的答案:--leagcy-peer-deps恢复从NPM v3到v6的peerDependency安装行为,而不是从v4到v6

另一种方法是将你的npm版本降级到版本6