部署前后端项目至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
相关产品推荐
相关产品推荐

