Angular 18升级时npm install依赖版本冲突问题求助
问题:Angular版本冲突(jest-preset-angular拉取v19导致与共享包v18依赖冲突)
背景
- 目前通过公司统一管理的npm包维护所有应用的依赖(暂未覆盖devDependencies),该共享包的
peerDependencies指定Angular版本为^18.2.13:
"peerDependencies": { "@angular/animations": "^18.2.13", "@angular/common": "^18.2.13", "@angular/core": "^18.2.13", "@angular/forms": "^18.2.13", "@angular/cdk": "18.2.13", "@angular/compiler": "18.2.13", "@angular/material": "18.2.13", "@angular/material-moment-adapter": "18.2.13", "@angular/platform-browser": "^18.2.13", "@angular/platform-browser-dynamic": "^18.2.13", "@angular/router": "18.2.13", "@aws-amplify/ui-angular": "^4.0.10", "@material/theme": "^15.0.0-canary.2a9697dc5.0", "@types/deep-diff": "1.0.5", "@types/luxon": "^3.4.2", "aws-amplify": "~5.3.27", "aws-sdk": "^2.1692.0", "core-js": "^3.38.1", "corejs": "^1.0.0", "custom-event-polyfill": "^1.0.7", "echarts": "^5.6.0", "file-saver": "^2.0.1", "filepond": "^4.31.4", "filepond-plugin-file-validate-type": "^1.2.4", "lodash": "^4.17.21", "luxon": "^3.5.0", "moment": "^2.30.1", "ngx-echarts": "^18.0.0", "ngx-extended-pdf-viewer": "^21.4.6", "ngx-filepond": "^7.0.3", "ngx-pagination": "^6.0.3", "rxjs": "^7.8.1", "sanitize.css": "^13.0.0", "tslib": "^2.8.1", "zone.js": "~0.14.10" }
- 应用的
package.json依赖该共享包,devDependencies中包含jest-preset-angular@^14.4.2:
"dependencies": { "@my_appstore/company-shared": "file:my_appstore-company-shared-17.4.17.tgz" }, "devDependencies": { "@angular-devkit/build-angular": "^18.2.12", "@angular-builders/custom-webpack": "^18.0.0", "@angular/cli": "18.2.12", "@angular/compiler-cli": "18.2.13", "@faker-js/faker": "^9.3.0", "@ngneat/spectator": "^16.0.0", "@types/jasmine": "~4.3.5", "@types/jasminewd2": "~2.0.3", "@types/jest": "^29.5.2", "@types/node": "^18.19.14", "@typescript-eslint/eslint-plugin": "^8.19.0", "@typescript-eslint/parser": "^8.19.0", "commit-and-tag-version": "^11.3.0", "eslint": "^8.57.1", "eslint-config-angular": "^0.5.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-angular": "^4.1.0", "eslint-plugin-html": "^8.1.2", "eslint-plugin-prettier": "^5.2.1", "jasmine-core": "~4.0.0", "jest": "^29.5.0", "jest-junit": "^16.0.0", "jest-preset-angular": "^14.4.2", "ng-mocks": "^14.11.0", "prettier": "3.3.3", "pretty-quick": "^4.0.0", "sass-lint": "^1.12.1", "tslint-jasmine-rules": "^1.6.1", "typescript": "^5.5.4" }
安装错误
执行npm i时出现如下错误:
npm ERR! Found: @angular/core@18.2.13 npm ERR! node_modules/@angular/core npm ERR! peer @angular/core@">=15.0.0 <20.0.0" from jest-preset-angular@14.4.2 npm ERR! node_modules/jest-preset-angular npm ERR! dev jest-preset-angular@"^14.4.2" from the root project npm ERR! peerOptional @angular/core@"18.2.13" from @angular/compiler@18.2.13 npm ERR! node_modules/@angular/compiler npm ERR! peer @angular/compiler@"18.2.13" from @angular/compiler-cli@18.2.13 npm ERR! node_modules/@angular/compiler-cli npm ERR! dev @angular/compiler-cli@"18.2.13" from the root project npm ERR! 1 more (jest-preset-angular) npm ERR! npm ERR! Could not resolve dependency: npm ERR! peer @angular/core@"19.0.5" from @angular/common@19.0.5 npm ERR! node_modules/@angular/common npm ERR! peer @angular/common@"19.0.5" from @angular/platform-browser-dynamic@19.0.5 npm ERR! node_modules/@angular/platform-browser-dynamic npm ERR! peer @angular/platform-browser-dynamic@">=15.0.0 <20.0.0" from jest-preset-angular@14.4.2 npm ERR! node_modules/jest-preset-angular npm ERR! dev jest-preset-angular@"^14.4.2" from the root project
问题原因
jest-preset-angular@^14.4.2对@angular/platform-browser-dynamic的版本要求是>=15.0.0 <20.0.0,npm自动拉取了最新的v19.0.5版本,进而要求Angular v19.0.5,与共享包指定的v18.2.13版本冲突。
多应用场景可维护解决方案
方案1:用npm overrides强制锁定Angular版本
在每个应用的package.json中添加overrides字段,强制所有依赖(包括jest-preset-angular的间接依赖)使用指定的Angular 18.2.13版本:
"overrides": { "@angular/common": "18.2.13", "@angular/platform-browser-dynamic": "18.2.13", "@angular/core": "18.2.13" }
优势:无需修改共享包或jest版本,直接强制统一版本,可通过脚本批量更新所有应用的package.json,适合快速解决冲突。
方案2:锁定jest-preset-angular及关联Angular包版本
在应用的devDependencies中明确指定@angular/platform-browser-dynamic为18.2.13,同时把jest-preset-angular的版本范围改为精确小版本(比如~14.4.2),避免npm自动升级间接依赖:
"devDependencies": { "jest-preset-angular": "~14.4.2", "@angular/platform-browser-dynamic": "18.2.13" }
优势:符合依赖管理规范,避免强制override,适合长期维护,可纳入公司共享的dev依赖模板中统一分发。
方案3:扩展共享包覆盖devDependencies
把devDependencies(包括jest-preset-angular及相关Angular开发包)也纳入公司共享包的管理范围,在共享包中指定明确的dev依赖版本,确保所有应用的开发依赖与业务依赖版本完全对齐。
优势:从根源上统一所有依赖版本,减少多应用间的版本不一致问题,适合公司统一管控的长期方案。
内容的提问来源于stack exchange,提问作者dcp3450
相关产品推荐
相关产品推荐

