如何在npm脚本间传递参数?适配环境判断场景的实现
解决方案
问题根源
你的脚本参数传递失败,核心原因有两个:
- 嵌套调用npm脚本时,未用
--分隔npm命令参数与要传递给目标脚本的额外参数; - 原脚本中
$@未用双引号包裹,导致带空格的参数解析异常,且无法确保参数被正确传递到ts-node/node命令中。
修改后的脚本配置
"no-local-build": "cd ./server && if [ \"$NODE_ENV\" = \"development\" ]; then npx ts-node src/tasks/$npm_config_task.ts \"$@\"; else node build/tasks/$npm_config_task.js \"$@\"; fi;", "runner": "npm run no-local-build --task=$npm_config_task -- $@"
关键修改说明
runner脚本调整:
添加-- $@,作用是将调用runner时传递的所有额外参数(如arg1、arg2)完整传递给no-local-build脚本。npm会将--后的内容视为被调用脚本的参数,而非npm自身的配置项。no-local-build脚本调整:
将$@改为"$@",确保每个参数(包括带空格的参数)都被作为独立单元解析,避免参数拆分错误,同时保证参数被正确传递到ts-node或node的执行命令中。
调用示例
- 开发环境执行带参数的任务:
NODE_ENV=development npm run runner --task=myCustomTask -- arg1 "argument with space" arg3 - 生产环境执行带参数的任务:
NODE_ENV=production npm run runner --task=myCustomTask -- arg1 arg2
注意事项
- 调用时必须在额外参数前加
--,否则npm会将这些参数识别为npm run命令自身的参数,无法传递到目标脚本; - 确保
$npm_config_task能正确获取到--task指定的任务名,npm会自动将--task=<task>转换为环境变量npm_config_task。
内容的提问来源于stack exchange,提问作者brendandev
相关产品推荐
相关产品推荐

