
Heroku 部署 Go 应用时,若依赖未被正确识别,需将 Godeps/Godeps.json 与 vendor/ 目录一并提交至代码仓库,并使用 git add -f 强制纳入所有 vendor 文件,否则构建会因找不到包而失败。
heroku 部署 go 应用时,若依赖未被正确识别,需将 `godeps/godeps.json` 与 `vendor/` 目录一并提交至代码仓库,并使用 `git add -f` 强制纳入所有 vendor 文件,否则构建会因找不到包而失败。
Heroku 的 Go 构建流程(尤其是较旧版本如 Go 1.6.3)依赖于 godep 工具还原依赖,但它不会自动执行 godep restore,而是直接基于 Godeps/Godeps.json 中的记录,从本地 vendor/ 目录加载依赖包。这意味着:vendor/ 目录必须存在于 Git 仓库中,且所有依赖文件需完整提交——Heroku 构建环境不会从网络拉取依赖,也不会运行 godep restore 命令。
你本地能正常运行,是因为 godep save ./... 已生成 Godeps.json 并将依赖复制到 vendor/,但该目录很可能被 .gitignore 忽略(例如 Go 1.5+ 默认忽略 vendor/),导致未提交到远程仓库。因此 Heroku 构建时虽检测到 Godeps.json,却无法找到 vendor/github.com/go-martini/martini,从而报错 cannot find package。
✅ 正确操作步骤如下:
-
确保 vendor/ 目录已生成(若尚未生成,请运行):
godep save ./...
-
强制将 vendor/ 和 Godeps/ 提交到 Git(绕过 .gitignore):
git add -f vendor/ Godeps/ git commit -m "chore: vendorize dependencies with godep"
-
推送至 Heroku:
git push heroku main
⚠️ 注意事项:
- git add -f 至关重要:许多项目 .gitignore 包含 vendor/ 或 *.swp、.DS_Store 等规则,不加 -f 会导致部分依赖文件遗漏;
- Godeps.json 中的 Rev 字段必须准确对应 vendor/ 中实际检出的 commit hash,否则本地与线上行为不一致;
- Heroku 官方示例(如 go-getting-started)包含 vendor/ 目录,正是此机制的体现;
- 若使用 Go 1.11+,建议迁移到官方 go mod + vendor 模式(go mod vendor),Heroku 同样支持,且更符合现代 Go 实践。
总结:Heroku 的 Go 构建是“纯静态依赖快照”模式——它不联网安装,只信任你提交的 vendor/。把依赖“打包进代码”,才是云端可靠部署的关键。











