如何解决 npm 中不同版本的传递依赖?

Posted

技术标签:

【中文标题】如何解决 npm 中不同版本的传递依赖?【英文标题】:How to resolve the transitive dependencies of different versions in npm? 【发布时间】:2021-11-14 06:06:43 【问题描述】:

我的应用程序依赖于 npm 包 ajv-keywords@apideck/better-ajv-errors,它们又依赖于包 ajv,但版本不同,如下面的错误所示。

npm ERR! peer dep missing: ajv@^6.9.1, required by ajv-keywords@3.5.2
npm ERR! peer dep missing: ajv@>=8, required by @apideck/better-ajv-errors@0.2.5

我尝试过的解决方案没有效果 -

安装并执行npm-install-peers https://***.com/a/56495651/16958085 中提到的解决方案

下图显示了两个包的加载方式-

> npm ls @apideck/better-ajv-errors@0.2.5
`-- my-app@0.1.8
  `-- react-scripts@5.0.0-next.37
    `-- workbox-webpack-plugin@6.2.4
      `-- workbox-build@6.2.4
        `-- @apideck/better-ajv-errors@0.2.5

> npm ls ajv-keywords@3.5.2
+-- babel-loader@8.2.2
| `-- schema-utils@2.7.1
|   `-- ajv-keywords@3.5.2
+-- my-app@0.1.8
| `-- react-scripts@5.0.0-next.37
|   `-- react-dev-utils@12.0.0-next.37
|     `-- fork-ts-checker-webpack-plugin@6.0.5
|       `-- schema-utils@2.7.0
|         `-- ajv-keywords@3.5.2  deduped
`-- webpack@5.53.0
  `-- schema-utils@3.1.1
    `-- ajv-keywords@3.5.2  deduped

请提出一个合适的解决方案来满足这两个依赖项。

【问题讨论】:

你试过在你的npm依赖文件中添加两个版本的ajv npm 不允许我们在 package.json 中添加同一个包的两个版本 【参考方案1】:

这从来都不是一个有趣的情况,也不能说 npm 和 yarn 都曾经完全/干净地解决了这个问题。

通常,您会被困在等待您的依赖项取消固定或升级其版本...

也就是说,不确定您是否有特定要求使用旧版本的 ajv-keywords,但最新的ajv-keywords uses ajv v8。

更新你的 package.json
"ajv-keywords": "^5.0.0"

然后重新运行 npm install 应该可以到达那里。

如有疑问,请务必查看他们的readme,以确认更新不会对您造成任何意外更改。

【讨论】:

以上是关于如何解决 npm 中不同版本的传递依赖?的主要内容,如果未能解决你的问题,请参考以下文章

对于内部依赖特定版本的不同包,如何管理项目中多个版本的 npm 模块?

Maven - 不同版本的传递依赖

如何解决传递依赖冲突问题?

npm学习之如何使用语义化版本

在纱线工作区中,如何强制解决子项目的依赖关系?

如何用不同的包完全覆盖嵌套的 npm 子依赖项(不仅仅是不同的包版本号)?