You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改启动脚本部署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脚本

  1. 创建start.sh文件,开头添加Shebang声明使用Bash:
#!/bin/bash
if [[ $MSERVICE == APP1 ]]; then
  node dist/apps/app1/main
else
  node dist/apps/app2/main
fi
  1. 本地给脚本添加执行权限:
chmod +x start.sh
  1. 将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:39:53