为何npm peer依赖未被强制执行?技术咨询
npm Peer依赖未触发版本冲突警告的原因解析
环境信息
$ npm -v 8.15.0 $ node -v v16.17.0
目录结构
peer-dep-test$ tree -I "node_modules" . ├── library │ ├── package-lock.json │ └── package.json └── project ├── package-lock.json └── package.json
相关package.json内容
library/package.json
{ "name": "library", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "peerDependencies": { "@altostra/type-validations": "2.6.5" } }
project/package.json
{ "name": "project", "version": "1.0.0", "main": "index.js", "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "description": "", "dependencies": { "@altostra/type-validations": "1.0.2", "library": "file:../library" } }
npm install后的依赖树
peer-dep-test/project$ npm list --all project@1.0.0 peer-dep-test/project ├─┬ @altostra/type-validations@1.0.2 │ └─┬ @reactivex/ix-es2015-cjs@3.0.2 │ ├── @types/node@13.13.52 │ └── tslib@1.14.1 └─┬ library@1.0.0 -> ./../library └─┬ @altostra/type-validations@2.6.5 └─┬ @reactivex/ix-es2015-cjs@3.0.2 ├── @types/node@13.13.52 └── tslib@1.14.1
原因分析
你遇到的情况核心是npm 7+对通过file:协议安装的本地包,peer依赖校验逻辑存在特殊处理:
- npm 7及以上版本默认会自动安装peer依赖,但对于本地file路径引入的包,npm不会校验宿主项目(project)中已安装的依赖版本是否满足该本地包的peerDependencies要求。
- 它会直接在本地包(library)的node_modules目录下安装符合peer依赖要求的版本,导致两个版本的
@altostra/type-validations共存,且不会触发版本冲突的警告或错误。 - 如果你的library是从npm仓库(包括本地私有仓库)安装的,而非通过
file:路径引入,npm会正常校验宿主项目中的依赖版本,此时若版本不匹配,会抛出预期的警告或错误(npm7+默认会将不满足peer依赖的情况视为错误,除非在package.json中配置peerDependencyMeta设置为可选)。
验证方法
将library发布到本地npm仓库(比如使用npm link或者搭建私有仓库如verdaccio),然后在project中通过包名安装library,此时npm就会检测到@altostra/type-validations的版本冲突,触发你预期的警告/错误。
内容的提问来源于stack exchange,提问作者BX21
相关产品推荐
相关产品推荐

