基于bash脚本实现NPM脚本条件执行的问题求助
解决npm prebuild脚本无法终止后续构建的问题
你的问题出在ask.sh的两处错误上:
- 输入
y时误用了break命令——break仅用于跳出循环或switch分支,在无循环的脚本中执行会导致脚本以非零退出码终止,反而会让npm中断后续构建流程; - 输入无效字符时,脚本默认以0退出码结束(最后一条
echo命令的退出码为0),npm会判定prebuild执行成功,继续运行后续的build和postbuild脚本。
npm的核心规则是:如果pre前缀的脚本以非零退出码终止,会自动停止后续的主脚本和post脚本执行。我们只需要修正ask.sh的逻辑,让它在用户选择n时返回非零码,选择y时返回0码,无效输入时循环询问直到得到有效答复即可。
修改后的ask.sh代码
#!/bin/bash while true; do read -p "Are you sure you want to build the app? (y/n) " yn case $yn in [yY]) echo "Building the app..." exit 0 # 正常退出,npm继续执行后续脚本 ;; [nN]) echo "Exiting..." exit 1 # 非零退出,npm终止后续所有脚本 ;; *) echo "Invalid response, please enter y or n." ;; esac done
修改说明
- 添加
while true循环,确保用户输入无效字符时会重复询问,直到得到y/n的有效答复; - 输入
y时用exit 0明确返回正常退出码,告知npm可以继续执行后续构建流程; - 输入
n时用exit 1返回错误退出码,触发npm终止后续所有脚本; - 移除了无效的
break命令,避免脚本意外报错中断正常流程。
package.json配置无需修改
保持原有的脚本配置即可:
"scripts": { "prebuild": "./ask.sh", "build": "vite build", "postbuild": "./anotherBashScript.sh" },
内容的提问来源于stack exchange,提问作者Youssef Zidan
相关产品推荐
相关产品推荐

