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

原文由 antonwilhelm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

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

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

一种解决方案: 强行安装mousetrap想要的特定版本的 反应

 yarn add react@16.8.0

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

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

 npm add xxxx --legacy-peer-deps

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

原文由 Izzi 发布,翻译遵循 CC BY-SA 4.0 许可协议

长话短说:

如果您从 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 忽略对等依赖并继续安装。 这就是 NPM v4 到 v6 过去的样子。

如果您不清楚常规 deps 和 peer deps 之间的区别,这里有一些上下文:

依赖与 peerDependencies

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

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

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

由于大量模块没有专门添加 React v17(或最近的 React 18)作为 peerDependency,现在在 v17 React 应用程序中运行 npm installs 时经常遇到 unable to resolve dependency tree 错误.

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

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

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

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

npm info name-of-module peerDependencies

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

原文由 Chris Perry 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题