如何在Node中通过run-s向预脚本任务传递脚本参数?Angular多模块项目场景问询
解决Angular多模块项目中Build前执行带参数的复制脚本问题
我来给你梳理下可行的解决办法,先说说你之前遇到的问题:
- npm的
prebuild预脚本虽然会自动在build前执行,但它是独立运行的,不会继承build命令传递的参数,所以你的复制脚本拿不到proj1这个参数。 - 你用
run-s的写法不对,{1}这种占位符不是npm脚本的标准用法,而且参数传递的逻辑没处理对。
下面是两种靠谱的解决方案,你可以按需选择:
方案一:直接串联脚本(无需额外依赖)
调整package.json的scripts配置,把复制脚本和ng build直接串联,用"$@"来传递所有参数:
{ "scripts": { "build": "node ./copyscript.js \"$@\" && ng build -- \"$@\"" } }
说明:
"$@"会把你执行npm run build时传递的所有参数(比如proj1)原封不动传递给后面的命令。- 如果你的复制脚本需要参数,但
ng build不需要,那可以去掉ng build后面的-- "$@",改成:"build": "node ./copyscript.js \"$@\" && ng build" - 在你的
copyscript.js里,可以通过process.argv获取参数,注意前两个元素是node路径和脚本本身路径,实际参数从索引2开始:// copyscript.js const projectName = process.argv[2]; // 这里就能拿到"proj1" console.log(`正在复制项目${projectName}的文件...`); // 你的复制逻辑
方案二:用npm-run-all(run-s)传递参数
如果你习惯用run-s来管理串行脚本,正确的配置应该是这样:
首先确保你已经安装了npm-run-all:
npm install npm-run-all --save-dev
然后修改package.json:
{ "scripts": { "copy": "node ./copyscript.js", "build": "run-s \"copy -- $@\" \"ng build -- $@\"" } }
说明:
- 这里用
$@传递参数,并且用引号把每个命令包裹,确保参数能正确传递给对应脚本。 - 执行命令的方式还是一样:
npm run build proj1
执行命令的注意点
如果你的参数里包含空格或者特殊字符,记得在参数前加上--,比如:
npm run build -- proj1 "with spaces"
这样就能保证参数被正确传递给复制脚本和ng build啦。
内容的提问来源于stack exchange,提问作者Apollo
相关产品推荐
相关产品推荐

