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

部署前后端项目至Heroku遇阻:根目录无package.json,如何指定backend目录?

解决Heroku部署根目录无package.json的问题

针对你的项目结构(根目录下有backend、frontend和.git,仅子目录存在package.json),以下两种方案可让Heroku正确识别并启动NestJS后端服务,同时保留现有CI/CD流程:

方案1:根目录添加极简package.json,串联构建与启动流程

在项目根目录新建package.json,通过脚本让Heroku自动完成前端编译和后端启动:

{
  "name": "你的项目名称",
  "version": "1.0.0",
  "scripts": {
    // 构建阶段:进入frontend安装依赖并编译,产物输出到backend的静态文件目录
    "heroku-postbuild": "cd frontend && npm install && npm run build -- --output-path=../backend/public",
    // 启动阶段:进入backend启动NestJS服务
    "start": "cd backend && npm start"
  },
  // 指定Node版本,需与backend/package.json中的版本一致
  "engines": {
    "node": "18.x"
  }
}

提示:根据你Angular项目的实际配置调整--output-path,确保编译后的文件能被NestJS的ServeStaticModule正确读取。

方案2:用Procfile指定启动命令(需配合根目录基础package.json)

如果想简化根目录package.json的内容,可以在根目录创建Procfile文件,直接指定启动命令:

web: cd backend && npm start

同时在根目录添加一个最基础的package.json,让Heroku识别为Node.js项目:

{
  "name": "你的项目名称",
  "engines": {
    "node": "18.x"
  },
  "scripts": {}
}

这种方式需要确保前端产物已经存在于backend的静态目录中——你可以在CI/CD流程中加入前端编译步骤,或者提前编译后提交产物到仓库。

关键注意点

  • 确认NestJS的静态文件服务配置正确,指向前端编译后的目录(比如ServeStaticModule.forRoot({ rootPath: join(__dirname, '..', 'public') }))。
  • 根目录的package.json无需包含依赖,Heroku会在执行脚本时自动进入backend/frontend目录安装对应依赖。
  • 现有CI/CD流程无需修改,依然推送整个rootfolder即可,Heroku会读取根目录的配置完成部署。

内容的提问来源于stack exchange,提问作者Forshank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:50:37