如何安全调整目录结构解决Heroku推送找不到package.json问题
问题原因
Heroku Node.js buildpack默认只会检测推送代码根目录下的package.json,你当前Git仓库根目录(最外层Recipes/文件夹)没有这个文件,两个package.json分别在recipes/backend/node_postgres/(后端)和recipes/frontend/(前端)子目录里,所以buildpack不会触发,构建直接失败。
方案1:不改任何目录结构(零风险,推荐优先用)
完全不用动现有文件,不会影响本地任何运行逻辑,用Heroku的子目录部署配置就行:
- 先确定你要部署的服务对应的子目录路径:
- 部署后端Node服务:路径是
recipes/backend/node_postgres - 部署前端静态项目:路径是
recipes/frontend
- 部署后端Node服务:路径是
- 打开终端,进到本地Git仓库根目录(就是
Recipes/文件夹,能看到.git隐藏文件夹的那层),依次执行下面三条命令:
heroku buildpacks:set subdir-heroku-buildpack # 把命令里的<目标路径>换成你上面选的实际子目录路径,比如部署后端就填recipes/backend/node_postgres heroku config:set PROJECT_PATH=<目标路径> heroku buildpacks:add heroku/nodejs
- 配置完正常执行
git push heroku main就行,Heroku会自动进到你指定的子目录执行Node构建流程,本地代码一个文件都不用改。
方案2:调整目录结构(适合长期维护,不会破坏原有逻辑)
如果想把结构整理成Heroku默认识别的标准结构,按下面步骤操作,每一步都可以本地验证,不会出问题:
- 先把整个
Recipes/文件夹复制一份当备份,操作都在原目录做,出问题直接用备份覆盖回滚。 - 先清理后端冗余层级:你现在后端代码套在
backend/node_postgres/下,多了一层无用的node_postgres目录,直接把node_postgres里的所有文件(index.js、package.json、package-lock.json等)全选移动到上一层backend/目录,删了空的node_postgres文件夹。移动完进到backend/目录,执行npm install重新拉一遍依赖,再跑node index.js确认后端能正常启动就行,依赖路径不会因为这层移动失效。 - 调整Git仓库根目录:现在你的Git仓库是在最外层
Recipes/下,把.git隐藏文件夹直接剪切到内层recipes/目录里,之后进到recipes/目录执行git status,只要没提示大面积文件删除就没问题。 - 按部署目标调整根目录文件:
- 单独部署后端:把
backend/下的所有文件全移到recipes/根目录,移完执行npm install、启动服务验证接口正常即可,此时根目录就有package.json,Heroku能直接识别 - 单独部署前端:把
frontend/下的所有文件全移到recipes/根目录,本地跑启动命令确认页面访问正常即可 - 需要同时部署前后端:在
recipes/根目录新建package.json,配置启动脚本同时拉起前后端服务,或者把前端构建后的静态文件交给后端托管,原有子目录的业务代码不用改,不会影响运行逻辑。
- 单独部署后端:把
- 所有调整完,本地把前后端都跑一遍,确认接口请求、页面跳转都和调整前完全一致,再推送代码到Heroku。
注意事项
- 不要手动改
node_modules里的任何文件,移动完代码重新执行npm install会自动修正所有依赖路径 - 记得在Git仓库根目录加
.gitignore文件,把node_modules目录加进去,不要把依赖文件夹提交到仓库,不然会导致部署包过大、构建失败 - 如果推送还是报找不到
package.json,执行git ls-tree -r main --name-only看一下提交到Git的文件列表,确认package.json确实在提交的根目录路径下
内容的提问来源于stack exchange,提问作者deadant88
相关产品推荐
相关产品推荐

