修复安装 NPM 包时的上游依赖冲突

我正在尝试 npm install vue-mapbox mapbox-gl,我得到了一个依赖树错误。

我正在使用 Vuetify 运行 Nuxt.js SSR,在运行这个安装之前还没有安装任何与 Mapbox 相关的东西,我得到了这个错误。

38 error code ERESOLVE
39 error ERESOLVE unable to resolve dependency tree
40 error
41 error While resolving: [1mexample[22m@[1m1.0.0[22m
41 error Found: [1mmapbox-gl[22m@[1m1.13.0[22m[2m[22m
41 error [2mnode_modules/mapbox-gl[22m
41 error   [1mmapbox-gl[22m@"[1m^1.13.0[22m" from the root project
41 error
41 error Could not resolve dependency:
41 error [35mpeer[39m [1mmapbox-gl[22m@"[1m^0.53.0[22m" from [1mvue-mapbox[22m@[1m0.4.1[22m[2m[22m
41 error [2mnode_modules/vue-mapbox[22m
41 error   [1mvue-mapbox[22m@"[1m*[22m" from the root project
41 error
41 error Fix the upstream dependency conflict, or retry
41 error this command with --force, or --legacy-peer-deps
41 error to accept an incorrect (and potentially broken) dependency resolution.
41 error
41 error See /Users/user/.npm/eresolve-report.txt for a full report.
42 verbose exit 1

解决上游依赖冲突的正确方法是什么?

273093 次浏览

在最新版本的 npm (v7)中,对等依赖关系似乎出现了问题,这个版本仍然是 beta 版本。

尝试与 npm install --legacy-peer-deps。为详细信息检查的博客文章 Npm v7 Series-Beta Release! And: SemVer-npm v7的主要变化

npm install之后使用 --legacy-peer-deps。例如,如果你想安装 ,使用:

npm install --legacy-peer-deps --save radium

有以下几种方式:

  1. 使用 npm install --legacy-peer-deps进行安装,如果这不起作用,请使用

  2. Npm 安装: npm install --force旁边添加—— force

直到 npm 版本7.19.1,它仍然有相同的问题。升级到7.20.3版之后,使用命令 npm install -g npm@latestnpm audit fix。所有的软件包将被修复,没有错误。

  • 删除 包裹锁定 Json文件
  • 修改 包裹 Json文件,根据对等依赖项指示更新版本
  • 运行 npm install 或 npm udpate

要解决这个问题,修复上游依赖冲突,安装 NPM 包错误

方法1。在 npm install之后使用 --legacy-peer-deps

例如,如果要安装 Axios,请使用

npm install --legacy-peer-deps --save axios.

方法2. 更新 npm 和“审核修复”

npm I -g npm@latest
npm audit fix --force

方法3. 使用 --force安装软件包

npm install axios --force

你可以执行这些命令

第一类:

npm config set legacy-peer-deps true

然后输入:

npx create-react-app my-app

我尝试了很多方法,但都不管用。最后我尝试了这个方法,它奏效了:

npm config set legacy-peer-deps true

在项目文件夹中运行此命令,然后尝试安装任何软件包。

我已经将 Node.js 版本降级到了10.23.1。

对于使用 --legacy-peer-deps有很多赞成,但是如果 --force有效,我建议使用它,因为它仍然固定许多依赖版本,而 --legacy-peer-deps完全忽略了对等依赖。请看下面的例子:

Npm: 何时使用 --force--legacy-peer-deps

几天前我开始在 Azure DevOps上收到这个错误。我一开始以为是 Azure 的一个小故障,但是因为它还在继续,我们开始更深入地研究它。

原来我们使用的代理 windows-2022几天前更新了:

为 win22版本20220607.3(# 5713)更新自述文件

Node 和 NPM 现在匹配 最新的 Node.js LTS 版本: 16.15.1(包括 NPM 8.11.0)

下载

您可以在 微软托管代理,软件上查看所有包含代理的软件。

在阅读了 Microsoft Visual Studio Developer Community 后,他们建议使用 Js 工具安装程序任务降级 Node.js,如下所示:

- task: NodeTool@0
inputs:
versionSpec: '16.14.2'

Js 工具安装程序任务

Azure DevOps 托管代理中 npm 安装失败

但是,我们决定不降级 Node.js,因此第一步是在本地匹配 Node.js 和 LTS 版本16.15.1和 npm 8.11.0。

在运行 npm ci时,我们在本地得到了相同的错误。

我们尝试了 npm ci --force,然后得到了这个错误:

npm ci只能在 package.json 和 包-lock. json 或 npm-shrinkwrap.json 是同步的。请更新 你的锁文件与 npm install之前继续。

即使在手动删除 node_modules之后,npm install仍然出现了相同的错误,但是 npm install --force工作了,并且生成了一个新的 包裹锁定 Json文件。

npm ci仍然因为相同的错误而失败,但是运行 npm ci --force仍然有效。我们决定更新 Azure DevOps .yml以包含 --force并检入新的 包裹锁定 Json文件。这样做之后,一切工作像以前一样,我们现在可以更新我们的软件包一个接一个。

要解决 npm 与 npm 包的依赖关系和冲突,请使用 Npm-检查-更新

您的依赖项 mexample需要 mmapbox-gl v1.13.0,而 mvue-mapbox需要 v0.53.0。

NPM 实际上不知道该怎么做,所以它给出了一个警告。可以使用 -- force--legacy-peer-deps绕过这些错误,但是忽略了一个错误。

生产选择:

  1. 升级包和修复升级错误可能会修复依赖关系冲突。

  2. 手动重写依赖项以避免警告和错误。您正在将版本设置为您知道可以工作的特定版本。通常是新的版本。

具有覆盖的示例解决方案。您的 包裹 Json文件如下所示:

{
"name": "my-app",
"version": "0.1.0",
"private": true,
"dependencies": {
"mexample": "^1.2.0",
"vue-mapbox": "*"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"overrides": {
"mmapbox-gl": "1.13.0"
}
}

最后一个选择是绕过使用以下两种方法:

  1. --legacy-peer-deps完全忽略所有使用最新版本的 同伴依赖关系,而不固定在文件 包裹锁定 Json
  2. --force强制使用最新的版本,将所有版本固定在 包裹锁定 Json

附加: 您不应该使用“ *”作为版本,因为它可能会更新主要和中断依赖关系。

我解决这个问题的方法是

steps:
- task: NodeTool@0
inputs:
versionSpec: '12.x'

我在这个问题上纠结了很久,这个问题也会导致其他命令的错误,这些命令需要一些正在中断的安装命令。

唯一有效的解决方案(可能会抑制错误)是

npm config set legacy-peer-deps true

这将把 legacy-peer-deps的配置设置为 true

这肯定有效:

npm config set legacy-peer-deps true

运行它,然后安装任何与 npm

这里的一切都不适合我。

在与这个问题斗争了这么久之后,我找到了一个有效的解决方案。 显然我在全球安装了一些软件包。

列出了:

npm list -g --depth=0

然后用以下方法移除不需要的包裹:

npm uninstall -g <package-name>

最后我把问题解决了

这里几乎所有的答案都建议使用 forcelegacy-peer-deps。虽然这在技术上是可行的,但是请注意,如果您可以避免这种情况,那么 NPM 不推荐这样做(来源)。有些人可能没有选择,但我能够通过删除 node-modulespackage-lock.json解决我的依赖冲突,然后手动更新包到他们的最新版本一次一个,直到它停止抱怨(包在错误消息后运行 npm i提到。这不是一个很好的或者干净的解决方案,但至少我的软件包是最新的,我没有忽略错误或者使用遗留的解决方案。