
Heroku 的 Go 构建包默认不自动执行 godep restore,而是直接运行 go install;因此必须将依赖通过 godep save 生成的 vendor/ 目录提交至代码仓库,否则会因找不到包而构建失败。
heroku 的 go 构建包默认不自动执行 `godep restore`,而是直接运行 `go install`;因此必须将依赖通过 `godep save` 生成的 `vendor/` 目录提交至代码仓库,否则会因找不到包而构建失败。
Heroku 对 Go 应用的构建流程是:检测 Godeps/Godeps.json 后,跳过 godep restore 步骤,直接调用 go install -v -tags heroku .。这意味着它不会从 Godeps.json 中还原依赖,也不会动态拉取第三方包——所有依赖必须已存在于构建环境的 $GOPATH/src/ 或(更关键地)Go 1.5+ 支持的 vendor/ 目录中。
自 Go 1.5 起,官方引入了 vendor 机制,而 godep 在该版本及以上默认将依赖复制到项目根目录下的 vendor/ 文件夹中(而非仅记录在 Godeps.json)。Heroku 的 Go 构建脚本正是依赖这一标准行为:它会自动识别并使用 vendor/ 中的包,从而绕过 $GOPATH 查找失败的问题。
✅ 正确操作步骤如下:
-
确保使用 godep save 生成 vendor 目录
运行以下命令(注意 ./... 表示递归保存所有子包依赖):godep save ./...
执行后,你会看到项目根目录下生成 vendor/ 文件夹及 Godeps/ 目录。
-
强制提交 vendor 和 Godeps(避免被 .gitignore 忽略)
很多 .gitignore 文件默认忽略 vendor/ 或其中的某些文件(如空目录、测试文件等),导致提交不完整。务必使用 -f(force)标志确保全部纳入:git add -f vendor/ Godeps/ git commit -m "chore: vendorize dependencies with godep"
-
推送并部署
git push heroku main # 或 master,依你的主分支名而定
⚠️ 注意事项:
- 不要仅提交 Godeps/Godeps.json 而忽略 vendor/ —— 这是 Heroku 构建失败的最常见原因;
- 若项目使用 Go modules(Go 1.11+),请改用 go mod vendor 并确保 go.mod/go.sum 已提交;Heroku 自 v1.12 起原生支持 modules,但需显式设置 GO111MODULE=on(可通过 heroku config:set GO111MODULE=on 配置);
- godep 已停止维护,新项目强烈推荐迁移到 Go modules(go mod init, go mod tidy, go mod vendor)。
总结:Heroku 不执行 godep restore,它只信任你提交的 vendor/ 目录。让依赖“可重现”的关键,不是配置文件,而是可检出、可构建的代码快照——vendor/ 就是这个快照的核心载体。











