npm install --legacy-peer-deps 到底做了什么?何时推荐/什么是潜在的用例?TL;DR:

2022-08-30 00:41:31

刚刚遇到此错误:

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 版本。

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

这很奇怪,因为我直到最近才用完,一切都很好。yarn


答案 1

TL;DR:

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

  • NPM v7+ 默认安装对等独立性;以前版本的 NPM 并非如此。
  • NPM 模块必须命名其对等依赖项的特定版本
  • 如果已安装对等依赖项,但未安装模块命名的版本,则 NPM v7+ 将引发错误
  • 添加会忽略此新要求,但可能会引入重大更改--legacy-peer-deps

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

思考这个标志的一种方式是它没有做一些新的事情;相反,它告诉NPM不要做一些新的事情,因为NPM v7现在默认安装对等独立性

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

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

如果你不清楚常规部门和对等部门之间的区别,这里有一些背景知识:

依赖关系与对等依赖关系

依赖:NPM 模块在生产环境中工作所需的库或模块。(例如:我最近建立了一个饼图模拟库,它使用Chance.js来计算指定范围内的随机数;因此,机会是我的模块的依赖关系

对等依赖关系:对等依赖关系是模块设计用于使用的第三方软件库的特定版本或一组版本。它们在概念上类似于浏览器扩展和浏览器之间的关系。(例如:react-redux 有两个非常合乎逻辑的 peerDependencies:和 .)reactredux

这个问题部分是由 React v17 驱动的。

由于大量模块尚未专门将 React v17 添加为对等依赖项,因此在 v17 React 应用程序中运行 npm 安装时遇到错误现在很常见。unable to resolve dependency tree

每当模块(或其自己的任何依赖项)将以前版本的 React 列为对等依赖项,而没有特别包括 React v17 时,就会触发此错误。

(注意:任何其他框架或库的主要版本更新也会发生类似的行为。

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

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

npm info name-of-module peerDependencies

此命令将返回每个对等依赖项的名称以及所有兼容版本。


答案 2

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

首先,发生了什么:react-hook-mousetrap正在寻找react@16.8.0,但它没有找到它。相反,它正在查找@react17.0.1,这是一个较新版本。由于某种原因,捕鼠器不喜欢这个新版本,并且您正在收到通知(这没什么大不了的,但他们决定值得停止您的构建)。

一个解决方案:强制安装捕鼠器想要的特定版本的react

yarn add react@16.8.0

这样做的作用是将你的反应版本回滚到与捕鼠器兼容的稍旧版本。你不会注意到任何差异,在将来的迭代中,希望捕鼠器得到更新,所以这就消失了。

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

npm add xxxx --legacy-peer-deps

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