Angular多staging环境配置:npm run传参仍默认使用prod环境文件
这个问题和你配置的环境文件、angular.json的fileReplacements规则完全无关,核心是npm脚本的参数传递机制导致传参失效:
npm run执行时,命令行追加的参数默认只会附加到最外层指定的脚本命令末尾,不会自动穿透嵌套的脚本调用链。你执行npm run prod --configuration staging1时,这个参数只会拼到npm run build && node build.js的整条命令最后,根本传不到中间的ng build环节。- npm本身会优先解析和自身相关的参数,你直接写的
--configuration staging1会被npm识别为自身的配置项,不会传给脚本;同时你现有的build脚本硬编码写死了--configuration=prod,不管外面传什么参数,到ng build这一步都会强制用prod配置,自然永远加载environment.prod.ts。
1. 调整package.json脚本逻辑
去掉build脚本里硬编码的固定配置值,同时在prod脚本里加透传逻辑,把外部传入的配置参数完整传给内层的ng build:
注意区分运行环境:你当前用的是
call命令,说明是Windows批处理环境,对应透传占位符用%*;如果是Mac/Linux环境,把占位符换成$@即可。
调整后的脚本示例:
{ "scripts": { "ng": "ng", "start": "node start.js && ng serve", // 去掉原来硬编码的 --configuration=prod,保留其他构建参数 "build": "node pre-build.js && ng build --output-hashing=none --extra-webpack-config webpack.extra.js", // 调用build脚本时,把收到的所有外部参数完整透传下去 "prod": "npm run build -- %* && node build.js" } }
2. 调整执行命令格式
需要在脚本参数前加--标识符,告诉npm后面的内容全部作为参数传给当前运行的脚本,不要自行解析或丢弃:
原来的错误命令:call npm run prod --configuration staging1
调整为正确的命令:call npm run prod -- --configuration=staging1
更稳定的跨平台实现(可选)
如果需要兼容Windows、Mac、Linux不同环境,避免参数透传的系统差异,可以用环境变量的方式传值,不需要依赖脚本透传:
- 先安装
cross-env依赖统一环境变量的设置方式 - 调整脚本,把硬编码的配置值替换为环境变量占位:
"scripts": { "build": "node pre-build.js && ng build --configuration=%ENV_CONFIG% --output-hashing=none --extra-webpack-config webpack.extra.js", "prod": "npm run build && node build.js" }
- 执行构建时先指定对应的环境配置,比如要构建staging1版本:
Windows批处理下执行:set ENV_CONFIG=staging1 && call npm run prod
Mac/Linux下执行:ENV_CONFIG=staging1 call npm run prod
调整完后,构建时查看Angular CLI的输出日志,如果看到日志里明确打印了Building Angular Project for configuration "staging1",就说明配置已经正确生效,会自动匹配对应的环境文件替换规则,不会再强制使用prod的环境配置。
你之前手动修改build脚本里的配置值就能生效,也恰恰说明angular.json的环境替换规则本身是完全正常的,问题只出在参数没有传到真正执行构建的ng命令上。
内容的提问来源于stack exchange,提问作者Robert

