我该如何修复npm UNMET PEER DEPENDENCY警告?

304

我正在使用 Windows 10 操作系统,安装了 Node 5.6.0 和 npm 3.6.0。我试图将 angular-material 和 mdi 安装到我的工作文件夹中。npm install angular-material mdi 命令出现以下错误:

+-- angular@1.5.0

+-- UNMET PEER DEPENDENCY angular-animate@^1.5.0

+-- UNMET PEER DEPENDENCY angular-aria@^1.5.0

+-- angular-material@1.0.6

+-- UNMET PEER DEPENDENCY angular-messages@^1.5.0 `-- mdi@1.4.57

npm WARN enoent ENOENT: no such file or directory, open
'C:\Users\xxxxx\Desktop\ngClassifieds\package.json' 

npm WARN angular-material@1.0.6 requires a peer of
angular-animate@^1.5.0 but none was installed. 

npm WARN angular-material@1.0.6 requires a peer of angular-aria@^1.5.0
but none was installed. 

npm WARN angular-material@1.0.6 requires a peer of
angular-messages@^1.5.0 but none was installed.

我该如何解决这个问题,以便安装AngularJS的Material和MDI?


这种类型的错误会产生问题吗? - blackHawk
不是给Reza的,所以现在已经晚了,但是对于其他人来说... 尝试这个命令:npm view angular-material peerDependencies - peter70
3
通常情况下,您不一定总是希望解决未满足的依赖关系。例如,如果某个软件包(some-package)依赖于 other-package@^1.5.0,而您已经安装了 other-package@2.0.0,则您可能无需回滚版本。最好先测试一下是否真正遇到了新版本的问题。 - John Pankowicz
3
请参见**为什么需要使用Peer Dependencies?**。 - mikemaccana
17个回答

240

现在npm不会自动安装对等依赖项,因此您需要手动安装它们,只需在所需的依赖项上执行npm install,然后再尝试重新安装主要依赖项即可。


回复评论:

此消息中已经明确指出您缺少哪些依赖项。

UNMET PEER DEPENDENCY angular-animate@^1.5.0 +-- 
UNMET PEER DEPENDENCY angular-aria@^1.5.0 +-- angular-material@1.0.6 +
UNMET PEER DEPENDENCY angular-messages@^1.5.0 `-- mdi@1.4.57` 

所以你需要运行 npm install angular angular-animate angular-aria angular-material angular-messages mdi


2
您需要将这些新的依赖项添加到您的 package.json 文件中吗? - 0xcaff
2
@caffinatedmonkey 那将是理想的。 - Datsik
9
如果你指定了 --save 开关,npm 会为你更新 package.json 文件(如果该包是开发依赖项,则使用 --save-dev)。 - McGuireV10
143
npm的整个意义不就在于为你管理所有这些依赖项吗?如果我运行npm install,然后得到了一堆未满足的依赖项列表,还要手动将它们添加到我的composer.json文件中,那这时我从npm中得到的价值是什么呢? - chiliNUT
4
从Npm v7.0.0开始,对等依赖关系将再次为您安装。 - StevenV
显示剩余5条评论

84

UNMET PEER DEPENDENCY错误是在package.json文件中指定的一个或多个模块的依赖关系未被满足时抛出的。仔细检查警告并使用正确的依赖版本更新package.json文件。

然后运行:

rm -rf node_modules/
npm cache clean
npm install

这将正确地安装所有必需的依赖项。


9
什么是同依赖? - aWebDeveloper
5
对我没有用。我仍然收到有关需要同行的警告。 - Adam Zerner
1
比被接受的解决方案干净得多!这一组代码处理了操作者问题的每种可能情况,而不仅仅是他们所遇到的特定问题。 - HoldOffHunger
1
使用npm cache clean命令会出现以下错误:从npm@5开始,npm缓存可以自我修复损坏问题,并且从缓存中提取的数据保证是有效的。如果您想确保所有内容一致,请使用“npm cache verify”代替。npm ERR!如果您确定要删除整个缓存,请使用--force重新运行此命令。 - CodeMonkey
@AdamZerner 或许你需要执行 npm install --save <dependendant_peer_package> <peer_dependency_package> 来明确解决未满足的依赖关系。 - Kamafeather
显示剩余2条评论

36

在我的情况下,所有的依赖都已经存在。如果是这种情况,请更新NPM,因为它可能已经崩溃了。这解决了我的问题。

npm install -g npm

对我有用。当我尝试安装 tslint 时,我收到了错误 UNMET PEER DEPENDENCY typescript。更新了 npm 后,必须先安装 typscript,然后再安装 tslint。 - Ravimallya
由于某些原因,我不得不多次运行它,直到所有依赖项都更新完毕。 - Coderer
1
这让我的npm出了问题,导致了一堆错误。 - Jack
很遗憾,对我来说也没有起作用。它显示了ERR! Unsupported URL Type "npm:": npm:string-width@^4.2.0 - Cadoiz

21

编辑 2020年

从npm v7.0.0开始,npm会自动安装对等依赖项。这是升级到v7的原因之一。

https://github.blog/2020-10-13-presenting-v7-0-0-of-the-npm-cli/

此页面也很好地解释了同依赖关系的基本原理。 https://github.com/npm/rfcs/blob/latest/implemented/0025-install-peer-deps.md


这个答案并不适用于所有情况,但如果你无法通过简单地输入npm install来解决错误,那么以下步骤可能会有所帮助。

假设你遇到了这个错误。

UNMET PEER DEPENDENCY packageA@4.2.0

npm WARN packageB@3.3.0 requires a peer of packageA@^3.1.0 but none was installed.

这意味着您安装了packageA的4.2.0版本,但是packageB@3.3.0需要3.x.x版本的pakageA。(解释^的内容
因此,您可以通过将packageA降级到3.x.x来解决此错误,但通常情况下,您不希望降级该包。好消息是,在某些情况下,packageB只是没有跟上packageA的步伐,并且packageB的维护者正在努力提高对packageA的同行依赖性至4.x.x。
在这种情况下,您可以检查npm或github中是否有更高版本的packageB,需要4.2.0版本的packageA。
例如,转到发行版页面enter image description here 通常情况下,您可以找到关于依赖项的重大变化。
packageB v4.0.0-beta.0

BREAKING CHANGE
package: requires packageA >= v4.0.0

如果在发布页面上找不到任何内容,请转到问题页面并通过关键字(如peer)搜索问题。您可能会发现有用的信息。

enter image description here

在这个时候,你有两个选择。

  1. 升级到你想要的版本
  2. 暂时保留错误,等待稳定版本发布。

如果你选择选项1:
在许多情况下,该版本没有latest标签,因此不稳定。因此,您必须检查此更新中发生了什么变化,并确保任何内容都不会破坏。

如果你选择选项2:
如果从版本3升级到版本4的pakageA是微不足道的,或者pakageB的维护者尚未测试pakageA的版本4,但表示不应该有问题,则可以考虑保留错误。

在两种情况下,最好彻底测试以确保不会出现任何问题。

最后,如果您想知道为什么必须手动执行此操作,这个链接解释得很好。


19

1
对我没用:“这个软件包似乎没有任何对等依赖项。” 然而,我有多条信息如下:“npm ERR!peer dep missing:@angular / common @ ^ 5.0.0 || ^ 6.0.0,required by @ agm / core @ 1.0.0-beta.3”。 - Almir Campos
2
该软件包仅安装当前软件包的直接对等依赖项,并不处理软件包依赖项(子级的对等依赖项)。 - Alex Skrypnyk

7

这个错误的最可能原因之一是你在package.json中定义了旧版本。为了解决这个问题,请将package.json中的版本更改为npm提示的版本。

完成后,运行npm install即可解决问题。


6
给出的答案并不总是有效的。如果它没有解决你的问题,请确保你在package.json中也使用了正确的符号。这非常重要,可以解决头痛的问题。例如:
warning " > @angular/compiler-cli@5.2.7" has incorrect peer dependency "typescript@>=2.4.2 <2.7".
warning " > tsickle@0.25.6" has incorrect peer dependency "typescript@>=2.4.2 <2.6".

所以我的TypeScript需要在2.4.2和2.6之间,对吗?

所以我将我的TypeScript库从使用"typescript": "^2.7"更改为使用"typescript": "^2.5"。看起来正确吗?

不正确。

^表示您可以使用"typescript": "2.5""2.6""2.7"等等...

如果您想了解^~的含义,请参见:package.json中波浪线(〜)和插入符号(^)有什么区别?

此外,您必须确保软件包存在。也许没有"typescript": "2.5.9",请查找包编号。如果您不想阅读它们的含义,为了确保安全,请删除~^


感谢您的解释。如果我使用两个库,其中第一个库(例如library-one)使用package@<2.6的同行,而另一个库(library-two)则使用package@>2.7的同行,那么我会不会最终需要处理代码库中的两个版本的package? 当我使用library-one时,如何知道我必须使用package@2.5.9,而当我使用library-two时,我必须使用package@2.7.1 - tonix
@tonix 试一下。导入一个旧的包和一个共享包的新包。npm会神奇地处理它。如果可能的话,它将获取并使用两者的正确版本,但也可以通过npm魔法同时使用两个版本。 - Samuel Thompson
你的意思是说,NPM 的这个特性在 ES6 的 import 层面上工作? - tonix
我的意思是我不太清楚它是如何工作的,但测试起来并不难,所以只需测试一下看看它会做什么。 - Samuel Thompson

3

好的,我花了很长时间努力想要弄清楚这个问题。这里是最有效的选择,当你已经尝试过所有其他方法后使用。

当您完成时,如果仍然可以正常工作,请将您的实际代码导入此新项目中。修复任何编译错误较新版本的angular会导致的错误。

对我有用的是这个...重新编写1小时与6小时的尝试破解的时间相比,希望我一开始就这样做。


OP正在使用AngularJS - Edric

2
今天可用的是Angular 2 rc.7,我遇到了与rxjs@5.0.0-beta.12 UNMET PEER DEPENDENCY类似的问题。如果你和我一样,只是将@angular/...rc.6替换为@angular/...rc.7,那就不够了。因为,例如,@angular/router没有rc.6版本。在这种情况下,最好查看Quick start中的package.json

OP正在使用AngularJS - Edric

2
这个问题也可能出现在尝试修复依赖项上的安全漏洞问题时。以下是我所做的: 审核已安装的依赖项。
npm audit

如果有可用的修复程序,运行以下命令通常可以解决问题:

npm audit fix

一些问题可能会出现SEMVER WARNING,点击链接可以得到手动审核的提示和下一步操作建议。
进一步研究后,我发现了这个命令:
npm upgrade

似乎npm audit fix没有考虑更新对等依赖项,而运行npm upgrade会解决未满足的对等依赖关系。 现在通过运行以下命令来检查我们是否已解决了此问题:

npm list

这将为我们的项目提供所有依赖项,并警告我们是否存在未满足的对等依赖项错误。如果您没有安全漏洞问题,升级大多数情况下实际上比保持使用的软件包的旧版本更好,npm install也是可行的选择。


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