
heroku 默认要求源码以触发构建流程,但可通过自定义二进制构建包(如 heroku-binary-buildpack)直接部署预编译的 go 二进制文件,前提是该二进制已针对 linux amd64 平台静态编译且具备可执行权限。
heroku 默认要求源码以触发构建流程,但可通过自定义二进制构建包(如 heroku-binary-buildpack)直接部署预编译的 go 二进制文件,前提是该二进制已针对 linux amd64 平台静态编译且具备可执行权限。
Heroku 原生 Go 构建包(heroku-buildpack-go)本质是封装了标准 Go 工具链:它在构建阶段自动调用 go build,根据项目结构(如是否存在 Gopkg.lock 或 go.mod)决定依赖解析方式,并最终生成可执行文件。这意味着——Heroku 本身并不强制绑定源码运行,而是依赖构建流程产出二进制;只要跳过源码构建环节,改由外部提供合规二进制,平台完全支持直接运行。
要实现“无源码部署”,关键在于两步:
-
本地交叉编译出兼容 Heroku 的二进制
Heroku 运行环境为 64 位 Linux(x86_64),且默认不包含 C 动态库(如 glibc)。因此推荐使用静态链接编译,避免运行时依赖缺失:
# 确保在项目根目录(含 main.go 或 go.mod) CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o myapp . # 或指定输出路径与模块名(适用于 module-aware 项目) CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/myapp github.com/yourname/yourapp/cmd/server
⚠️ 注意事项:
- 必须设置 CGO_ENABLED=0 以禁用 CGO,确保纯静态链接;
- -a 参数强制重新编译所有依赖(推荐用于生产发布);
- 生成的二进制需具备可执行权限:chmod +x myapp;
- 避免使用 os/exec 调用系统命令或依赖特定路径(如 /tmp 可写,但 /usr/bin 不可用)。
-
配置 Heroku 使用二进制构建包
移除默认 Go 构建包,启用社区维护的 heroku-binary-buildpack:
# 清除原有构建包 heroku buildpacks:clear # 设置二进制构建包(必须放在首位) heroku buildpacks:set https://www.php.cn/link/c9326f7c1d4caa281c20622b0c1d3b24 # (可选)若需在二进制启动前执行初始化脚本,可追加 shell 构建包 heroku buildpacks:add --index 2 https://github.com/heroku/heroku-buildpack-shell
随后,将编译好的二进制文件(如 myapp)置于 Git 仓库根目录,并添加一个 Procfile 明确声明进程类型:
web: ./myapp -port $PORT
✅ 提示:Heroku 通过环境变量 $PORT 动态分配端口,你的程序必须监听此端口,否则无法接收 HTTP 流量。
最后提交并部署:
git add myapp Procfile git commit -m "add prebuilt binary and Procfile" git push heroku main
部署成功后,Heroku 将跳过编译阶段,直接解压、授权并运行你提供的二进制文件。整个过程不涉及任何源码上传,满足闭源分发需求。
? 总结:
- Heroku 支持无源码部署,但需借助第三方二进制构建包;
- 二进制必须为 Linux amd64 静态链接版本,且严格遵循 Heroku 运行时约束(端口、文件系统、进程模型);
- 此方案适用于 SaaS 分发、内部工具交付或合规性要求严格的场景,兼顾安全性与部署灵活性。










