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

2024-04-28

刚刚遇到这个错误:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: [email protected] /cdn-cgi/l/email-protection
npm ERR! Found: [email protected] /cdn-cgi/l/email-protection
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 [email protected] /cdn-cgi/l/email-protection
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直到最近一切都很好。


TL;DR:

  • NPM v7+ 安装peerDependency默认情况下 https://github.com/npm/rfcs/blob/main/implemented/0025-install-peer-deps.md;这是not以前版本的 NPM 的情况也是如此。
  • NPM 模块必须命名具体版本他们的peerDependency
  • 如果您已经安装了peerDependency,但没有使用该模块命名的版本,那么NPM v7+将抛出错误
  • Adding --legacy-peer-deps忽略这一新要求,冒着引入重大变更的风险

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

思考这个标志的一种方式是,它并不是在做新的事情;而是在做一些新的事情。相反,它告诉 NPMnot从 NPM v7 开始做一些新的事情现在默认安装peerDependency.

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

The --legacy-peer-depsv7 中引入了 flag 作为绕过 peerDependency 自动安装的方法;它告诉 NPM 忽略对等部门并继续安装。这就是 NPM v4 到 v6 的过去情况。

如果您不清楚常规部门和同行部门之间的区别,这里有一些背景信息:

依赖关系与对等依赖关系

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

对等依赖关系:对等依赖是特定版本或版本集第三方软件库的一个模块被设计为与。它们在概念上类似于浏览器扩展和浏览器之间的关系。 (例子:反应还原 https://react-redux.js.org/有两个非常合乎逻辑的peerDependency:react and redux.)

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

由于大量模块没有专门添加 React v17(或者最近的 React 18)作为 PeerDependency,现在遇到以下情况是很常见的:unable to resolve dependency tree在 v17 React 应用程序中运行 npm install 时出错。

每当模块(或其任何自己的依赖项)将 React 的先前主要版本列为对等依赖项而不使用此错误时,就会触发此错误具体包括也反应 v17。

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

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

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

npm info name-of-module peerDependencies

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

npm install --legacy-peer-deps 到底做了什么?何时推荐/潜在的用例是什么? 的相关文章

随机推荐