
go 1.6.2 原生支持 vendor 机制,但要求 vendor 目录必须严格位于 gopath/src/ 路径下(而非项目根目录),否则编译器将完全忽略该目录,导致 “cannot find package” 错误。
go 1.6.2 原生支持 vendor 机制,但要求 vendor 目录必须严格位于 gopath/src/ 路径下(而非项目根目录),否则编译器将完全忽略该目录,导致 “cannot find package” 错误。
在 Go 1.5 引入 vendor 实验性支持、Go 1.6 正式启用 vendor 机制后,Go 工具链对 vendor 目录的查找路径有明确约定:仅当 vendor 目录位于当前包所在路径的 src/ 子树中,且其父级路径属于 GOPATH/src 的某个子目录时,才会被识别并启用。
这意味着,若你的项目结构为:
/home/charney/myproject/ ├── glide.yaml ├── vendor/ ← ❌ 错误位置:位于 GOPATH 根下,不在 src/ 内 ├── src/ │ └── myapp/ ← 主包所在路径(如 myapp 是 import path)
即使 GOPATH=/home/charney/myproject,Go 也不会扫描 /home/charney/myproject/vendor/,因为该 vendor 不在任何 src/<import-path>/vendor/ 路径中。
✅ 正确做法是将 vendor/ 移至 src/ 下,与主包同级或嵌套于其 import path 对应的目录中。例如:
# 假设你的 main 包 import path 是 "myapp" mkdir -p src/myapp mv vendor src/myapp/ # 或更通用的做法(推荐): mv vendor src/
此时项目结构应为:
/home/charney/myproject/
├── glide.yaml
├── glide.lock
├── bin/
├── pkg/
└── src/
├── myapp/ # 你的代码,如 src/myapp/main.go
└── vendor/ # ✅ 正确位置:src/ 下的 vendor 可被 Go 1.6.2 自动识别
└── golang.org/x/net/context/验证方式:运行 go list -f '{{.Dir}}' myapp 确认 Go 解析的包路径是否包含 src/myapp;再执行 go test ./...,错误应消失。
⚠️ 注意事项:
- Go 1.6+ 默认启用 vendor(无需设置 GO15VENDOREXPERIMENT=1),但路径合规性是前提;
- Glide 会自动将依赖安装到 vendor/,但不会自动调整 vendor 位置——需手动迁移;
- 若使用多个子模块(如 src/github.com/user/repo),vendor 应置于对应 import path 的最外层 src/ 目录下(即 src/vendor/),而非每个子目录下重复创建;
- 升级至 Go 1.11+ 后,建议迁移到 Go Modules(go mod init),它不再依赖 GOPATH 和 vendor 位置约束,兼容性与可维护性更优。
总结:Go 1.6.2 的 vendor 机制不是“项目根目录下的 vendor 就生效”,而是遵循严格的路径匹配规则——vendor 必须是 GOPATH/src/<any-import-path>/vendor 或 GOPATH/src/vendor。将 vendor 移入 src/ 是解决此类问题的最小必要修正。

















