了解peerDependencies

package.json中除了dependency和devDependency之外,还有一个peerDependency。这里通过解决一个实际报错来了解下它。

报错信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR!
npm ERR! While resolving: a@0.0.1-beta
npm ERR! Found: ssh2@1.15.0
npm ERR! node_modules/ssh2
npm ERR! ssh2@"1.15.0" from the root project
npm ERR! ssh2@"^1.12.0" from ssh2-sftp-client@9.1.0
npm ERR! node_modules/ssh2-sftp-client
npm ERR! ssh2-sftp-client@"^9.1.0" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer ssh2@"1.16.0" from a@0.0.1-beta
npm ERR! packages/a
npm ERR! a@0.0.1-beta
npm ERR! node_modules/a
npm ERR! workspace packages/a from the root project
npm ERR!
npm ERR! Conflicting peer dependency: ssh2@1.16.0
npm ERR! node_modules/ssh2
npm ERR! peer ssh2@"1.16.0" from a@0.0.1-beta
npm ERR! packages/a
npm ERR! a@0.0.1-beta
npm ERR! node_modules/a
npm ERR! workspace packages/a 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.
npm ERR!
npm ERR!
npm ERR! For a full report see:
npm ERR! /Users/alanhe/.npm/_logs/2025-01-02T02_53_13_141Z-eresolve-report.txt

npm ERR! A complete log of this run can be found in:
npm ERR! /Users/alanhe/.npm/_logs/2025-01-02T02_53_13_141Z-debug-0.log


错误分析

项目的直接依赖中,ssh2的版本是1.15.0,而包a的peerDependency中,ssh2的版本是1.16.0。

peerDependency作用是使用a包的项目中在安装ssh2的时候,需要使用1.16.0的版本。因此这里报错了。

解决方案

知道了问题的直接原因也就好解决了。解决办法:升级主项目的ssh2版本即可。

总结

  1. 回头来看peerDependencies。就是说它可以约定限制使用了该包的项目中,依赖目标包的版本。即通过该配置你可以限制运行该包的项目中如果依赖该包,版本必须满足要求。
  2. peerDependencies声明包,而主项目dependency没有,目前的npm比如v9是不会直接安装的,除非是有其它包有作为依赖,则还是会安装。