
Heroku 部署 Go 应用时,若出现 cannot find package 错误,根本原因是依赖未随代码一同提交——必须将 Godeps/ 和 vendor/ 目录完整纳入 Git 仓库,且需强制添加(git add -f)以绕过 .gitignore 干扰。
heroku 部署 go 应用时,若出现 `cannot find package` 错误,根本原因是依赖未随代码一同提交——必须将 `godeps/` 和 `vendor/` 目录完整纳入 git 仓库,且需强制添加(`git add -f`)以绕过 `.gitignore` 干扰。
Heroku 的 Go 构建包(Go buildpack)在检测到 Godeps/Godeps.json 后,会尝试通过 godep restore 恢复依赖,但该操作仅在 Go 1.4 及更早版本中默认生效。自 Go 1.5 起,官方引入 vendor 目录机制,而 Heroku 的构建流程(尤其在 Go 1.6+ 环境下)实际依赖的是 vendor/ 目录中的源码,而非远程拉取——这意味着 vendor/ 必须作为代码的一部分被提交至仓库。
你的 Godeps.json 结构正确,也已执行 godep save,但关键遗漏在于:godep save ./... 在 Go 1.5+ 下默认将依赖写入 vendor/ 子目录,而该目录很可能被 .gitignore 排除(例如因包含 vendor/ 或 **/vendor/ 规则),导致其未进入 Git 提交。Heroku 构建时找不到 vendor/github.com/go-martini/martini,自然报错 cannot find package。
✅ 正确操作流程如下:
-
确保 vendor 已生成(若尚未生成,请运行):
godep save ./...
-
强制添加 Godeps 和 vendor 到暂存区(绕过 .gitignore):
git add -f Godeps/ vendor/
-
提交变更:
git commit -m "chore: vendorize dependencies with godep"
-
推送至 Heroku:
git push heroku main
⚠️ 注意事项:
- 不要仅提交 Godeps.json 而忽略 vendor/——Heroku 不会在构建时执行 godep restore 来下载依赖(尤其在启用 GO15VENDOREXPERIMENT=1 的现代 Go 版本中);
- 检查 .gitignore 是否意外屏蔽了 vendor/(常见于全局或项目级忽略规则),可临时运行 git check-ignore -v vendor/github.com/go-martini/martini 验证;
- 若使用较新 Go 版本(≥1.11),建议迁移到 go mod(Heroku 原生支持),此时只需提交 go.mod 和 go.sum,无需 vendor/(但需确保 GO111MODULE=on)。
总结:Heroku Go 部署不是“构建时拉依赖”,而是“构建时读 vendor”。提交完整的 vendor/ 是硬性要求——这是云平台无外网依赖、保障构建可重现的核心设计。

















