Angular项目仅GitHub Actions构建失败 npm ci报ERESOLVE依赖冲突
问题根因
- 本地可正常编译、CI构建失败的直接诱因是npm版本差异:本地环境使用npm 6及以下版本时,peer依赖版本不匹配只会输出警告不会阻断安装;GitHub Actions的ubuntu-latest镜像搭配Node 16默认安装npm 7+版本,peer依赖校验默认开启严格模式,版本范围不满足时直接抛出
ERESOLVE错误终止流程,两边行为不一致才会出现"本地运行正常、CI执行失败"的现象。 - 项目本身存在两处明确的依赖版本错配:
- 项目所有核心Angular生态包(@angular/*、@angular/cdk、@angular/material等)都已经升级到14版本,但
@angular-eslint/schematics还停留在适配Angular 13的13.2.1版本,其要求的@angular/cli版本范围和项目使用的14版本完全不兼容。 - 项目依赖的
angular2-csv@0.2.9已经停止维护多年,最高仅支持Angular 6版本,和当前Angular 14的核心包版本完全不兼容。
- 项目所有核心Angular生态包(@angular/*、@angular/cdk、@angular/material等)都已经升级到14版本,但
- 之前尝试降级@angular/cli到13版本的思路完全错误:项目核心依赖全是Angular 14版本,单独降级CLI只会引发更多版本冲突,不可能解决问题。
合规解决方案(不使用--force/--legacy-peer-deps临时绕过)
- 对齐@angular-eslint版本到Angular 14生态
执行命令将@angular-eslint/schematics升级到适配Angular 14的14大版本,如果本地还装了其他@angular-eslint开头的开发依赖(比如@angular-eslint/eslint-plugin、@angular-eslint/template-parser等),全部统一升级到14.x版本,和Angular主版本保持一致:npm install --save-dev @angular-eslint/schematics@14 - 替换废弃的angular2-csv依赖
这个包早已停止维护,没有适配Angular 14的版本,直接卸载:
CSV导出功能不需要依赖老旧第三方包,直接用浏览器原生Blob API实现即可,兼容Angular 14,无额外依赖,参考实现:npm uninstall angular2-csv
把项目中原来调用angular2-csv的地方全部替换成这个工具方法即可。// 可放到src/app/utils/csv.ts工具文件中 export function exportCsv(filename: string, dataRows: Record<string, unknown>[]) { if (!dataRows.length) return; const delimiter = ','; const tableKeys = Object.keys(dataRows[0]); const csvText = [ tableKeys.join(delimiter), ...dataRows.map(row => tableKeys.map(key => { let value = row[key] ?? ''; if (value instanceof Date) value = value.toISOString(); value = String(value).replace(/"/g, '""'); if (/[",\n]/.test(value)) value = `"${value}"`; return value; }).join(delimiter)) ].join('\n'); const blob = new Blob([csvText], { type: 'text/csv;charset=utf-8' }); const downloadLink = document.createElement('a'); const blobUrl = URL.createObjectURL(blob); downloadLink.href = blobUrl; downloadLink.download = `${filename}.csv`; downloadLink.hidden = true; document.body.append(downloadLink); downloadLink.click(); downloadLink.remove(); URL.revokeObjectURL(blobUrl); } - 统一本地和CI的运行环境,从根源避免环境差异问题
- 本地删除
node_modules文件夹和package-lock.json文件,执行npm install重新生成锁文件,确认本地执行npm ci和npm run build都能正常跑通后,把新的锁文件提交到Git仓库。 - 在CI配置中显式锁定npm版本,和本地开发使用的npm大版本保持一致,避免GitHub Actions默认升级npm带来的行为变化,修改工作流配置,在setup-node步骤后添加版本锁定步骤:
# 示例:本地使用npm 8时就指定8.x,和本地版本对齐即可 - run: npm install -g npm@8.x- 团队所有成员统一使用.nvmrc中指定的Node 16版本,避免不同Node/npm版本导致的依赖解析差异。
- 本地删除
- 验证修复
本地重新执行npm ci和npm run build,确认没有报错后推送代码,GitHub Actions流程即可正常完成构建。
内容的提问来源于stack exchange,提问作者galah92
相关产品推荐
相关产品推荐

