npm install --legacy-peer-deps的确切作用是什么?何时推荐使用它/潜在的用例是什么?

tv6aics1  于 2022-11-14  发布在  其他
关注(0)|答案(6)|浏览(686)

遇到此错误:

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,直到最近,一切都很好。

hk8txs48

hk8txs481#

TL;DR:

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

  • NPM v7+安装对等依赖项by default; NPM以前的版本是这种情况。
  • NPM模块必须为其对等依赖项命名特定版本
  • 如果您已经安装了peerDependency,但是没有安装模块指定的版本,那么NPM v7+将抛出一个错误
  • 添加--legacy-peer-deps会忽略此新要求,这可能会引入破坏性更改

--legacy-peer-deps从NPM v4到v6恢复对等依赖关系安装行为

一种看待这面旗帜的方式是,它并没有做什么新的事情;相反,它告诉NPM * 不要 * 做一些新的事情,因为NPM v7现在默认安装了对等依赖关系
在许多情况下,这会导致版本冲突,从而中断安装过程。
--legacy-peer-deps标志是在v7中引入的,作为一种绕过peerDependency自动安装的方法;它告诉NPM忽略对等部门并继续安装。这是NPM v4到v6的工作方式。
如果你不清楚常规部门和同级部门之间的区别,这里有一点背景:

依赖项与对等依赖项

**相依性:*NPM模块需要的程式库或模块, 以便在生产环境中运作 *。(范例:我最近构建了一个饼图模拟库,它使用Chance.js来计算指定范围内的随机数;因此,机会是我的模块的一个 * 依赖 。)
对等依赖项:对等依赖关系是第三方软件库的一个 * 特定版本或一组 * 版本,
模块设计用于 * 该软件库。它们在概念上类似于浏览器扩展和浏览器之间的关系。(例如:react-redux具有两个逻辑上相当合理的对等依赖关系:reactredux)。

此问题部分是由React v17+驱动的

由于大量模块没有专门添加React v17(或最近的React 18)作为peerDependency,现在在v17 React应用程序中运行npm安装程序时,经常会遇到unable to resolve dependency tree错误。
每当模块(或其自身的任何依赖项)将React的先前主版本作为peerDependency列出,而没有 * 特别包括 * React v17时,就会引发此错误。
(* 注意:* 任何其他框架或库的主版本更新都会出现类似的行为。)

如何检查任何给定模块的对等依赖关系

NPM本身不会在给定模块的页面上列出对等部门。但是,有一个简单的解决方案可以在安装之前或之后检查对等部门。只需运行:
npm info name-of-module peerDependencies
此命令将返回每个peerDependency的名称沿着所有兼容版本。

hc8w905p

hc8w905p2#

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

**首先,发生了什么:**react-hook-mousetrap正在寻找react@16.8.0,但没有找到。相反,它找到了@react17.0.1,这是一个较新的版本。由于某种原因,mousetrap不喜欢这个较新的版本,并通知了您(这不是什么大事,但他们认为值得停止您的构建)。
一种解决方案:强制安装mousetrap需要的react特定版本:

yarn add react@16.8.0

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

**另一个解决方案:**做出彻底的决定,不安装任何旧版本依赖项:

npm add xxxx --legacy-peer-deps

它所做的是忽略这个包的旧依赖项。它更全面,并为您做出很多决定。

thigvfpy

thigvfpy3#

我决定(使用Yarn)将以下内容添加到package.json

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

o4tp2gmn4#

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

8e2ybdfx

8e2ybdfx5#

--leagcy-peer-deps跳过所有peer依赖的安装,并给出peer deps的警告,提醒开发人员手动安装,当遇到peer deps冲突时,除了--legacy-peer-deps,还有一种选择是使用--force
处理对等部门冲突的官方文档为this
附言
纠正上面的回答:--leagcy-peer-deps将peerDependency安装行为从NPMv3恢复到v6,而不是从v4恢复到v6。

qlzsbp2j

qlzsbp2j6#

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

相关问题