
go 1.6.2 原生支持 vendor 机制,但要求 vendor 目录必须严格位于 gopath/src/ 下的某个包路径内(而非 gopath 根目录),否则编译器将忽略该目录,导致“cannot find package”错误。
go 1.6.2 原生支持 vendor 机制,但要求 vendor 目录必须严格位于 gopath/src/ 下的某个包路径内(而非 gopath 根目录),否则编译器将忽略该目录,导致“cannot find package”错误。
在 Go 1.5 引入 vendor 实验性支持、Go 1.6 正式启用后,Go 工具链对 vendor/ 目录的查找遵循明确的规则:仅当 vendor/ 子目录存在于当前导入路径所对应的 src/ 子目录中时,才会启用 vendor 查找逻辑。这意味着 vendor/ 必须是某个 Go 包源码树(即 GOPATH/src/
你当前的项目结构为:
. ├── glide.yaml ├── glide.lock ├── bin ├── pkg ├── src # ← GOPATH/src 指向此处 └── vendor # ❌ 错误:vendor 与 src 并列,Go 工具链完全忽略它
此时,即使 GOPATH=/home/charney/myproject,Go 也会在以下路径搜索 golang.org/x/net/context:
- $GOROOT/src/golang.org/x/net/context
- $GOPATH/src/golang.org/x/net/context(即 /home/charney/myproject/src/golang.org/x/net/context)
但不会检查 /home/charney/myproject/vendor/golang.org/x/net/context —— 因为 vendor/ 不在任何有效包路径的 src/ 子树中。
✅ 正确做法是将 vendor/ 移入 src/ 目录,并确保你的主模块位于 src/ 下(例如 src/myapp/):
.
├── glide.yaml
├── glide.lock
├── bin
├── pkg
└── src
├── myapp/ # 你的主包,如 main.go 在此
└── vendor/ # ✅ 正确:vendor 是 src 的子目录,且与 myapp 同级
└── golang.org/x/net/context/
这样,当你在 src/myapp/ 中执行 go test 时,Go 会按如下顺序解析 golang.org/x/net/context:
- src/myapp/vendor/golang.org/x/net/context(命中 ✅)
- src/golang.org/x/net/context(fallback)
- $GOROOT/src/golang.org/x/net/context
⚠️ 注意事项:
- Glide 本身不修改 Go 的 vendor 查找行为;它只负责将依赖复制到 vendor/ 目录。最终是否生效,完全取决于 Go 工具链能否定位到该 vendor/。
- GOPATH 必须唯一且指向项目根目录(含 src/),避免多路径干扰。
- 若使用 go build -o bin/app ./src/myapp,请确保工作目录在 GOPATH 内,或显式指定 -ldflags="-extldflags=-static" 等参数不影响 vendor 路径解析。
- Go 1.11+ 推荐迁移到 Go Modules(go mod init),可彻底摆脱 GOPATH 和 vendor 位置限制;但在 Go 1.6.2 环境中,严格遵守 src/vendor/ 结构是唯一可靠方案。
总结:Go 1.6.2 的 vendor 机制是路径敏感的——vendor/ 不是“全局依赖缓存”,而是“包级局部依赖快照”。把它放进 src/,就等于告诉 Go:“这个 vendor 是 src 下所有包的本地依赖视图”。结构对了,问题自然消失。











