【问题标题】:How do I read npm "conflicting peer dependency" error messages?如何阅读 npm \"conflicting peer dependency\" 错误消息?
【发布时间】:2022-08-24 12:50:20
【问题描述】:

我正在尝试升级我拥有的项目的一些 npm 依赖项,并且我收到“冲突的对等依赖项”错误。

我在这个网站上看到很多问题,要求帮助修复此类错误。但是,我一直在努力寻找有关这些错误实际上是什么的信息意思是.我觉得如果我理解了这一点,我就有很大的机会自己想办法解决这个问题。

这是我试图解释的错误消息:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! Found: @angular-devkit/build-angular@0.1102.5
npm ERR! node_modules/@angular-devkit/build-angular
npm ERR!   dev @angular-devkit/build-angular@\"~0.1102.9\" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! dev @angular-devkit/build-angular@\"~0.1102.9\" from the root project
npm ERR! 
npm ERR! Conflicting peer dependency: @angular/localize@11.2.10
npm ERR! node_modules/@angular/localize
npm ERR!   peerOptional @angular/localize@\"^11.0.0 || ^11.2.0-next\" from @angular-devkit/build-angular@0.1102.9
npm ERR!   node_modules/@angular-devkit/build-angular
npm ERR!     dev @angular-devkit/build-angular@\"~0.1102.9\" from the root project
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

这可以通过在 this Github branch 的根目录中运行 npm install 来重现(我正在使用 npm 7.10.0。)

我对“冲突对等依赖”错误的一般理解是,我所依赖的某个包在包版本规范上表达了peer dependency,它与我实际安装的那个包的版本不匹配。

例如,如果我的项目直接依赖于包AB,并且我安装了A12.0.0 版本,但我的B 版本对^11.0.0 的包@987654335 有对等依赖@,然后我会得到一个冲突的对等依赖错误,因为我正在使用 B 和它可能不兼容的 A 版本。

因此,我对该错误消息可能意味着什么的最佳猜测是,我所依赖的某些包对 @angular/localize 版本规范 ^11.0.0 || ^11.2.0-next 具有对等依赖,但此规范与我安装的 @angular/localize 版本不匹配。

当我查看my package-lock.json 时,我确实看到node_modules/@angular-devkit/build-angular 条目在其peerDependencies 中有一个\"@angular/localize\": \"^11.0.0 || ^11.2.0-next\" 条目。

然而,这是该文件中唯一提及@angular/localize 的地方——或者实际上是在package.json 中。我没有明确要求安装它。此外,在node_modules/@angular-devkit/build-angularpeerDependenciesMeta中标记为\"optional\": true。因此,看到与之相关的错误消息令人惊讶。

该错误提到特定冲突的对等依赖项是@angular/localize@11.2.10。我看不到那个版本号是从哪里来的。但无论如何,它实际上似乎与下面的依赖规范相匹配:如果我转到 semver.npmjs.com 并输入 @angular/localize 作为包和 ^11.0.0 || ^11.2.0-next 作为版本范围,我会看到包的版本 11.2.10 以绿色突出显示,表示它与范围匹配。

因此,我非常感谢您能帮助我详细了解此错误消息告诉我的内容。我不知道为什么npm 会尝试安装11.2.10@angular/localize,或者为什么它认为这与@angular-devkit/build-angular 的对等依赖规范冲突。感觉我可能完全误解了这条信息。

我猜这归结为某些 Angular 包的最新发布版本之间的某种不兼容。如果有人对如何修复这个特定错误有任何指示,那就太好了——但我更感兴趣的是简单地理解错误消息告诉我的内容,所以我可以自己解决。

提前谢谢了!

    标签: npm


    【解决方案1】:

    通读this GitHub issue,看来我对错误消息的解释是正确的,这实际上是npm 中的一个错误。

    这似乎已报告为npm/cli/issues/3083;修复has been merged,所以我想我们只需要等到它包含在即将发布的npm 版本中。

    【讨论】:

    • 还没有修好
    • 还没修好?
    • 仍然没有修复:(
    • 我不太确定这个答案是 OP 的问题。他们不是在问如何读取实际输出吗?
    【解决方案2】:

    推荐:

    查看Yarn

    我能够通过使用Yarn 而不是 NPM 来规避 NPM 中的问题。 Yarn 基本上是一个围绕 NPM 的包装实用程序,它添加了额外的功能,非常有用。它对于更好地管理 NPM 依赖关系特别有帮助。

    例如,它可以直接或作为子依赖项检查您的机器上是否已经为另一个项目安装了一个包,并且可以重用已安装的版本,而不是重新安装同一个包的副本;节省空间并加快安装速度,尤其是对于一些最常见的依赖项。

    因此,由于 Yarn 处理依赖项的优化方式,我认为它有助于避免 OP 面临的这个问题。

    解析度:

    1. 首先,删除项目中的node_modules 文件夹。
    2. Yarn 会抱怨任何package-lock.json 文件,因此也将其删除(或备份,然后删除)。不要删除package.json,yarn 会需要它。
    3. 只需安装yarn:npm i yarn(你也可以全局安装)。
    4. 然后在您的项目目录中运行yarn install

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 2016-06-14
      • 2021-07-15
      • 2016-09-18
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      相关资源
      最近更新 更多