You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:52:04