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

IT技术 javascript node.js reactjs npm npm-install
2021-04-11 03:14:23

刚刚遇到这个错误:

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! 

我尝试安装的module似乎与我安装的module具有不同的对等依赖项。似乎 npm 在这方面改变了它的行为,现在让安装失败。

我现在能做些什么来解决这个问题?我不想为此降级我的 React 版本。

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

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

4个回答

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

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

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

--legacy-peer-deps标志是在 v7 中引入的,目的是绕过 peerDependency 自动安装;它告诉 NPM 忽略对等节点并继续安装。这就是过去 NPM v4 到 v6 的情况。

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

依赖关系 vs peerDependencies

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

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

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

由于大量module没有专门添加 React v17 作为 peerDependency,现在在 v17 unable to resolve dependency treeReact 应用程序中运行 npm installs 时遇到错误是司空见惯的

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

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

如何检查任何给定module的 peerDependencies

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

npm info name-of-module peerDependencies

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

tl;博士:

  • NPM v7 现在默认安装 peerDependencies;v4-v6 不是这种情况
  • peerDependency 是第三方 npm module,给定的module旨在与它一起工作
  • NPM module必须命名其 peerDependencies 的特定版本
  • 如果你正在运行,例如,一个阵营V17的应用程序和module尚未上市的阵营17作为peerDependency -但已经上市的旧版本-它会炸掉安装
  • 添加--legacy-peer-deps到您的 npm 安装将绕过 peerDependency 自动安装,但这可能会由于潜在的破坏性更改而导致冲突
@redeville 你能发送一个重现问题的 CodeSandbox 吗?我很高兴来看看
2021-05-22 03:14:23
在另一个线程中 - 我让其他人指出 npm 7.11。?需要更新,这就是可能的原因。我没有证明这一点,由于时间限制,我拉了 --legacy 标志。当我有时间时会尝试并返回。谢谢!
2021-05-22 03:14:23
很好的解释!但我仍然感到困惑:“冲突的对等依赖项:@angular/platform-b​​rowser-dynamic@11.2.13”在我的根目录中。它显然与“@angular/fire@6.1.4”冲突,后者表明需要兼容版本:“peer @angular/platform-b​​rowser-dynamic@”^9.0.0 || ^10.0.0 || ^11.0.0" - 为什么会出现错误?这些似乎没有冲突?
2021-06-10 03:14:23

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

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

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

yarn install react@16.8.0

这样做是将您的react版本回滚到与捕鼠器兼容的稍旧版本。您不会注意到任何差异,并且在未来的迭代中,希望捕鼠器已更新,因此这种情况会消失。

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

npm install xxxx --legacy-peer-deps

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

@dtabuenc - 我已经更新了。如果您认为这仍然不正确/具有误导性,请进行编辑。谢谢
2021-05-26 03:14:23
有什么方法可以让我们只更改任何软件包的版本并仅使用 npm install 来完成?
2021-06-02 03:14:23
--legacy-peer-deps 不会将任何依赖项回滚到任何版本。它只是不尝试自动安装对等依赖项。
2021-06-06 03:14:23
我不明白的是npm.anvaka.com/#/view/2d/react-hook-mousetrap 一开始就没有显示出这样的依赖关系?!
2021-06-09 03:14:23

我解决了(用纱线)将以下内容添加到 package.json

"resolutions": {
    "**/react": "17.0.2",
    "**/react-dom": "17.0.2"
},
有没有一种方法可以只与 npm install 一起使用并更改 package.json 中的任何包版本?
2021-06-06 03:14:23

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