【问题标题】:What does npm install --legacy-peer-deps do exactly? When is it recommended / What's a potential use case?npm install --legacy-peer-deps 究竟做了什么?什么时候推荐/什么是潜在的用例?
【发布时间】:2021-05-20 05:00:32
【问题描述】:

刚刚遇到这个错误:

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,一切都很好。

【问题讨论】:

  • 我刚刚做了npm install xxxx --legacy-peer-deps。安装工作正常,但我不确定以这种方式解决它是否是一个好主意,因为我不太了解标志,这就是我问的原因。但是还没有发现标志真正的作用! :(
  • 我特别想知道--legacy-peer-deps--force 有何不同,因为我的npm 建议使用任何一种方法:npm ERR! Fix the upstream dependency conflict, or retry this command with --force, or --legacy-peer-deps

标签: javascript node.js reactjs npm npm-install


【解决方案1】:

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

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

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

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

如果您不清楚常规部门和同行部门之间的区别,这里有一点上下文:

依赖与 peerDependencies

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

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

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

由于大量模块没有专门添加 React v17 作为 peerDependency,现在在 v17 React 应用程序中运行 npm installs 时遇到unable to resolve dependency tree 错误很常见。

只要一个模块(或其任何自己的依赖项)将以前版本的 React 列为 peerDependency 而没有特别包括 React v17,就会触发此错误。

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

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

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

npm info name-of-module peerDependencies

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

tl;博士:

  • NPM v7 现在默认安装 peerDependencies; v4-v6 并非如此
  • peerDependency 是一个第三方 npm 模块,给定模块被设计用于使用
  • NPM 模块必须命名其 peerDependencies 的特定版本
  • 如果你正在运行,例如,一个 React v17 应用程序和一个模块没有将 React 17 列为 peerDependency - 但 列出了旧版本 - 它会破坏安装
  • --legacy-peer-deps 添加到您的 npm 安装将绕过 peerDependency 自动安装,但这可能会由于潜在的重大更改而导致冲突

【讨论】:

  • 很好的解释!但我仍然感到困惑:“冲突的对等依赖:@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" - 为什么会出现错误?这些似乎没有冲突?
  • @redeville 你能发送一个重现问题的 CodeSandbox 吗?我很高兴看看
  • 在另一个线程中 - 我有其他人指出 npm 7.11.?需要更新,这可能是原因。由于时间限制,我没有证明这一点,我拉了 --legacy 标志。当我有时间时会尝试并返回。谢谢!
【解决方案2】:

我是这样解决这个问题的:

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

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

yarn add react@16.8.0

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

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

npm add xxxx --legacy-peer-deps

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

【讨论】:

  • --legacy-peer-deps 不会将任何依赖项回滚到任何版本。它只是不会尝试自动安装对等依赖项。
  • @dtabuenc - 我已经更新了。如果您认为这仍然不正确/具有误导性,请编辑。谢谢
  • 我不明白的是npm.anvaka.com/#/view/2d/react-hook-mousetrap一开始就没有表现出这样的依赖关系?!
  • 有什么方法可以改变任何包的版本,只用 npm install 来做?
【解决方案3】:

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

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

【讨论】:

  • 有没有一种方法可以仅用于 npm install 并更改 package.json 中的任何包版本?
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2016-09-10
    • 2023-03-15
    • 2012-10-17
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多