修改启动脚本部署NestJS Monorepo到Heroku遇bash语法错误求解
问题解决:Heroku无法识别Bash条件语法的问题
错误原因
Heroku默认使用POSIX标准的sh执行启动脚本,而你用的[[ ]]是Bash专属的扩展条件判断语法,sh不支持该语法,因此抛出[[: not found]]错误。
解决方案
方案1:改用POSIX Shell兼容的语法
将[[ ]]替换为[ ],同时把Bash风格的==换成POSIX标准的=,并给变量加上引号避免空值/空格导致的语法错误:
"start": "if [ \"$MSERVICE\" = APP1 ]; then node dist/apps/app1/main; else node dist/apps/app2/main; fi"
方案2:强制使用Bash执行脚本
方式A:在package.json脚本中指定Bash
直接在启动命令前加上bash -c,强制用Bash解析脚本:
"start": "bash -c 'if [[ $MSERVICE == APP1 ]]; then node dist/apps/app1/main; else node dist/apps/app2/main; fi'"
方式B:使用独立的Bash脚本
- 创建
start.sh文件,开头添加Shebang声明使用Bash:
#!/bin/bash if [[ $MSERVICE == APP1 ]]; then node dist/apps/app1/main else node dist/apps/app2/main fi
- 本地给脚本添加执行权限:
chmod +x start.sh
- 将
start.sh提交到Git,然后修改package.json的启动脚本:
"start": "./start.sh"
方案3:用Node.js脚本替代Shell脚本(推荐,无兼容性问题)
编写一个简单的Node.js脚本start.js,通过环境变量判断启动哪个服务:
const { spawn } = require('child_process'); const servicePath = process.env.MSERVICE === 'APP1' ? './dist/apps/app1/main.js' : './dist/apps/app2/main.js'; spawn('node', [servicePath], { stdio: 'inherit' });
然后修改package.json的启动脚本:
"start": "node start.js"
额外注意事项
- 确认Heroku上的
MSERVICE环境变量已正确配置(APP1/APP2) - 确保Heroku的构建脚本已正确编译NestJS项目到
dist目录,比如package.json中添加:
"scripts": { "build": "nest build", "start": "...", ... }
内容的提问来源于stack exchange,提问作者Anson Cen
相关产品推荐
相关产品推荐

