安装npm包时出现无法解析依赖树的错误

720

尝试使用npm i命令安装npm软件包时,我遇到了以下异常:

图片描述

我已尝试重新安装Node.js软件包并通过以下方式关闭代理:

set HTTP_PROXY=
set HTTPS_PROXY=
问题依然存在。我做错了什么吗? 更新: 当我运行以下命令时:
npm install --legacy-peer-deps
以下错误显示:

在此输入图片描述


5
请展示你的package.json文件 - 看起来你已经升级了@angular/core,但没有升级@angular/http? - Adam Jenkins
package-lock.json文件不可用。是的,我已经尝试删除node_modules,但没有成功。 - Pearl
1
这个问题还在发生吗?你能分享一下 package.json 文件吗? - Supun Praneeth
这个问题解决了吗?如果是的话,如果任何答案对您有帮助,请将其中一个标记为“已接受”。否则,如果您需要更多澄清,请告诉我们。 - Eliezer Berlin
对我来说,由于我有备份,所以我删除了本地仓库并进行了全新的拉取,然后再次尝试 npm install,这对我起作用了。 - Huzaifa
显示剩余7条评论
37个回答

817

这与HTTP代理无关。

正如它所说,您有依赖冲突不正确且可能是损坏的依赖项),因此请尝试使用--force--legacy-peer-deps命令运行。如果没有效果,临时解决方案使用先前版本的Node.js(降级Node.js版本),因为有时会导致这种错误的发生。

根据OP的更新进行更新:

如您所见,它触发了以下错误:

@angular/http@^9.1.4没有匹配版本。

请查看angular/http页面注意,该废弃包的最新版本为7.2.16,而您请求更高版本(例如^9.1.4!因此,请检查项目依赖项并遵循引发的错误以解决问题。


1
@Pearl,请展示 --force--legacy-peer-deps 命令的输出结果。 - Amirhossein Mehrvarzi
186
谢谢!npm install --legacy-peer-deps 对我很有用。 - Gaurav Patil
7
它告诉 NPM 忽略对等依赖并继续安装。 - Amirhossein Mehrvarzi
将项目中的react文件夹打开终端,我遇到了以下错误: $ npm install npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree使用下面的命令解决了问题,谢谢。 npm install --legacy-peer-deps - Devaski
5
谢谢,将 Node 版本从 15 降级到 14 对我起了作用。 - asmaa
显示剩余10条评论

358
尝试以下命令-
--legacy-peer-deps 这个选项用于在项目中遇到与对等依赖的兼容性问题时使用。对等依赖是一种包指定它依赖于另一个包但不想将其作为直接依赖项包含在内的方式。这样可以让多个包依赖于一个公共包,而不必在项目中拥有多个副本。
--legacy-peer-deps 选项告诉包管理器(npm 或 Yarn)在解析和安装具有对等依赖冲突的包时使用较旧、更宽松的方法。如果您正在使用未更新其对等依赖定义以与较新的包管理器行为相一致的旧包,这可能会很有用。
npm install --save --legacy-peer-deps

162
请解释它的功能。 - ESP32
23
@Gerfried,这句话告诉NPM忽略同等依赖并继续安装。 - Aashiq
3
如果使用npm 5或更高版本,则不需要--save标志,因为它会自动保存依赖项。 - Naga
2
它会安装Angular 7的一半,以及Angular 9的一半。如果你这样做,它可能会真的工作,但愿上帝怜悯你,因为你肯定在运行一些与你当前版本的Angular不兼容的库。 - Eliezer Berlin

332

首先要理解问题。以下是我遇到的错误:

npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: project-admin@11.0.0
npm ERR! Found: @angular/common@11.0.3
npm ERR! node_modules/@angular/common
npm ERR!   @angular/common@"11.0.3" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer @angular/common@"^9.1.0 || ^10.0.0" from @agm/core@3.0.0-beta.0
npm ERR! node_modules/@agm/core
npm ERR!   @agm/core@"3.0.0-beta.0" from the root project

首先,您应该从底部向上阅读问题。这里 @agm/core@3.0.0-beta.0 要求 angular common 的版本为 9.1.0 或 10.0.0。而顶部信息显示找到的 angular common 版本实际上是 11.0.3。

(如果您想更好地理解依赖关系,请参阅此简单网站:如何使用 npm3

dependencies — these are the essential dependencies that you rely on and call in your project’s code
devDependencies — these are your development dependencies, for example, a prettier library for formatting code
peerDependencies — if you set a peer dependency in your package.json, you are telling the person who installs your package that they need that dependency with the specified version
optionalDependencies — these dependencies are optional and failing to install them will not break the installation process
bundledDependencies — it’s an array of packages that will come bundled with your package. This is useful when some 3rd party library is not on NPM, or you want to include some of your projects as modules

那么应该怎么解决呢? 问题在于对等依赖项。 解决方案是降级 angular common 或者 使用--legacy-peer-deps 逻辑来安装包的旧版本依赖项。 因此,--legacy-peer-deps 不会尝试自动安装 peerDependencies。这对您有用吗? 可能是,但您应该添加特定说明以了解如何执行此操作,或者使使用 --legacy-peer-deps 自动进行将来的项目包安装。使用来自之前答案之一的代码:

npm config set legacy-peer-deps true

在我的情况下,我安装了这个包并尝试运行ng serve,但是因为使用了--legacy-peer-deps,一些依赖包没有被安装。我不得不手动安装它们(因为我没有从上面的代码中设置配置)。最后,手动安装了大约五个带有--legacy-peer-deps的包,最后遇到了一个无法安装的包,而且我的项目也会抛出很多警告,并且还有许多要审核的包。所以我的决定是不使用这个包,寻找替代方案。

我在途中读到的其他解决方案:

  • 将Node.js降级到v14. 这将降级npm。可能不是v14,但这是最广泛降级的版本。
  • 有些人使用Yarn强制安装包——就我个人而言,我不太理解它的工作原理,因为我没有使用过Yarn。
  • 将Angular和全局的Angular CLI版本降级到满足要求的版本。在我的情况下,它是angular/common,在问题中是angular/core,但都需要将整个Angular降级(这里我不太确定)。
  • 您安装的包可能有一个不需要降级Angular的更高版本。您可以尝试使用https://updatepackagejson.com/将您的软件包升级到最新版本,但这是针对项目相当新的情况。

27
这是最好的答案,因为它是唯一一个解释了 OP 错误日志而非愚蠢地应用 force 或 legacy-peer-deps 选项的答案。最好坚持使用 npm 6 而不是强制推动 npm 7 并在其上使用 force/legacy-peer-deps 来避免解决依赖问题。 - HoLengZai
4
到目前为止,这是最好的答案,其他人只是解决了问题,却不关心潜在的问题,也没有提供有见地的建议解释为什么会出现这个问题。 - jeffng50
我是npm的新手,但我相信使用npm install --force更好,因为它只在必要时忽略peer-dependencies,而--legacy-peer-deps采用了npm v6的方法并完全忽略peer-dependencies。请参见@Hongbo Miao的答案:https://dev59.com/JFEG5IYBdhLWcg3wcNo9 - s6mike
1
npm config set legacy-peer-deps true 是魔法,谢谢! - Jeb50
1
非常感谢您。我了解依赖关系和一切,但是您解释了错误消息的含义。我一直尝试从上到下阅读,所以我得出了完全错误的结论。我希望错误消息更加用户友好,但是您的解释使理解错误消息成为可能。 - juanpaco
1
如果你想检查一个包是从哪里来的,以防它是由另一个包安装的,你可以使用以下命令:npm ls --depth 1 - undefined

132

除了使用 --legacy-peer-deps 命令行选项外,这也可以作为配置选项更加永久地设置:

npm config set legacy-peer-deps true

6
如果npm install是间接运行的,例如通过脚本,最佳选项是什么。 - kszl
9
这是什么功能? - Sam
@Arefe,Aashiq在另一个类似的答案中解释说,这个命令(legacy-peer-deps)“告诉NPM忽略同行依赖并继续安装”。 - Alvaro Rodriguez Scelza
npm config set legacy-peer-deps true这个命令对我有效,谢谢。 - Krishan Gopal

81

最终,我找到了答案。尝试使用这个命令 -

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

在这里描述 legacy-peer-deps


27
解释会使这个答案更好。 - derekbaker783
4
请提供原文以便翻译。 - Vinay Somawat
2
你的回答与这个回答有何不同? - WhatsThePoint
我的答案有解释。 - Vinay Somawat

74

当使用 npm 7 时,由于同行依赖的问题在版本7中被视为错误而不是警告,因此经常会出现此问题,通常使用 --legacy-peer-deps 可以使其在 npm 7 中正常工作。

如果以上方法无效,另一种选择是降级到 npm 6。降级 Node.js 不是必需的(但也没有害处)。相关的依赖管理代码位于 npm 中。降级 Node.js 往往会起作用,因为这样做通常也会降级 npm

比降级 npm 更少干扰的另一种选择是使用 npx 来仅针对 install 命令使用之前版本的 npmnpx -p npm@6 npm install

当所有方法都失败时,通常值得尝试删除 node_modules 目录和 package-lock.json 文件,然后再次运行 npm install。这将重新生成 node_modulespackage-lock.json


什么是永久降级到npm 6的最佳方法? - alentejo
2
通过删除C:\ Users \ {your name} \ AppData \ Roaming中的npm文件夹, npm cache clear --force,然后运行npm install -g npm@<version> 命令来更新npm版本。 - Valdemar Vreeman

65

首先,在您的终端中执行此操作。

npm config set legacy-peer-deps true

其次,清除缓存:

npm cache clean --force

最后,执行你的命令。


4
清除缓存有帮助吗?我们真的需要第二步吗? - Hari Reddy
14
Please add explanation. - justdvl

61

在更新到npm 7之后,一些软件包可能会出现这种情况。

参数--legacy-peer-deps可以帮助解决:

npm i --legacy-peer-deps

介绍了在 legacy-peer-deps 中使用的方法。

导致npm在构建软件包树时完全忽略peerDependencies,就像 npm 版本3到6一样。

如果由于过度严格的peerDependencies而无法安装软件包,则提供了一种解决该情况的方法。
...

您可以将此选项默认设置为true(不推荐由npm):

npm config set legacy-peer-deps true

或者等待这些软件包更新到最新版本。


16

该问题涉及到依赖冲突或依赖损坏。您可以通过强制安装来接受依赖项不正确的情况。

解决方案:使用带有--force的命令。

您的命令将类似于npm install --force @your-npm-package

注意:如果该依赖项可以使用yarn包管理器安装,则可以使用yarn来安装它。


14

NPM可以用于安装和管理项目依赖的版本。

我在使用React版本时遇到了与npm版本相关的同样的问题:

npm错误发现types/react@16.14.20

因此,可能需要根据您的package.json文件安装包版本。

它在npm 7版本中会产生错误,并且无法安装Node.js模块。

如果您将npm版本降级为6,这些问题将变成警告,问题将得到解决。

  • 尝试运行以下命令:npm install -g npm@6

  • 检查是否已安装版本:npm --version

  • 删除并安装node_modules包:

    a)删除 rm -rf node_modules

    b)安装: npm i


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接