如何调试Heroku Node.js Buildpack的heroku-postbuild钩子?
heroku-postbuild未执行的问题 嘿,我之前也踩过这个坑!你说的情况我太熟悉了——用create-react-app搭的项目,明明在package.json里加了heroku-postbuild脚本,推到Heroku后却完全看不到它执行的日志,简直让人头大。咱们一步步来排查解决:
1. 先检查package.json的脚本配置是否完整准确
从你贴的代码来看,scripts部分最后是截断的,先确认heroku-postbuild是不是完整写对了。正确的配置应该类似这样:
"scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", "heroku-postbuild": "npm run build" }
⚠️ 重点:Heroku只会识别完全匹配的heroku-postbuild命名,拼写错一个字母、大小写不对都不行,比如写成heroku_postbuild或者Heroku-postbuild都不会触发。
2. 确认Heroku的Buildpack配置正确
Heroku需要用Node.js的buildpack来执行npm脚本,所以得检查你的项目是不是配置了正确的buildpack:
- 打开Heroku控制台的项目「设置」页面,找到「Buildpacks」,确认里面有
heroku/nodejs;如果有多个buildpack,一定要把Node.js的那个排在最前面(buildpack是按顺序执行的)。 - 也可以用命令行检查:
如果输出里没有nodejs的buildpack,用下面的命令添加:heroku buildpacksheroku buildpacks:add heroku/nodejs
3. 确保package.json在项目根目录
Heroku只会在项目的根目录查找package.json来执行脚本。如果你的React项目是放在子文件夹里(比如根目录下的client文件夹),那Heroku根本找不到你的脚本,自然不会执行。这种情况有两种解决办法:
- 把React项目的文件移到项目根目录;
- 在根目录的
package.json里配置heroku-postbuild,指定去子文件夹执行构建:"heroku-postbuild": "cd client && npm install && npm run build"
4. 指定Node和npm版本,避免兼容问题
有时候Heroku默认使用的Node/npm版本和本地不一致,可能导致脚本不执行。你可以在package.json里明确指定版本:
"engines": { "node": "14.x", "npm": "6.x" }
这样Heroku会严格按照你指定的版本来构建,减少版本兼容带来的问题。
5. 检查日志是否看全了
有时候heroku-postbuild的日志可能藏在build阶段的中间,你可以用命令行查看完整的部署日志:
heroku logs --tail # 实时查看部署过程的日志 # 或者查看最近1000条日志 heroku logs --num 1000
仔细找有没有Running heroku-postbuild的字样,如果完全没有,那基本可以确定是前面的配置出了问题(比如buildpack不对、package.json位置错误)。
最后,先在本地测试执行npm run heroku-postbuild,看看会不会报错。如果本地执行都有问题,那Heroku肯定也跑不起来,先把本地的问题解决了再说。
内容的提问来源于stack exchange,提问作者Lizi

