
Go 1.6.2 默认启用 vendor 机制,但仅当 vendor 目录位于 当前包所在目录的根路径(即 $GOPATH/src 下的项目根目录)内 时才被识别;若 vendor 位于 GOPATH 根目录下而非 src 子目录中,则 Go 工具链将完全忽略它。
go 1.6.2 默认启用 vendor 机制,但仅当 vendor 目录位于 **当前包所在目录的根路径(即 $gopath/src 下的项目根目录)内** 时才被识别;若 vendor 位于 gopath 根目录下而非 src 子目录中,则 go 工具链将完全忽略它。
Go 1.6 引入了官方 vendor 支持,但其查找逻辑有明确约束:vendor 目录必须与 main 包(或被编译/测试的包)处于同一代码树层级,并且该树必须位于 $GOPATH/src/ 路径之下。在你的项目结构中:
. ├── glide.yaml ├── glide.lock ├── bin ├── pkg ├── src # ← Go 工具链只在此目录及其子目录中解析包 └── vendor # ❌ 错误位置:位于 GOPATH 根,不在 src 内部
此时 GOPATH=/home/charney/myproject,Go 会将 src/ 视为唯一合法的源码根目录,而 vendor/ 与 src/ 并列,不构成任何包的 vendor 上级目录,因此 go test 或 go build 完全不会扫描它。
✅ 正确做法是将 vendor/ 移入 src/ 下,使其成为项目源码树的一部分:
.
├── glide.yaml
├── glide.lock
├── bin
├── pkg
└── src
└── myapp # 假设你的包导入路径为 "myapp"
├── main.go
└── vendor # ✅ 正确位置:与 main.go 同级或上级(如 src/myapp/vendor)或者更常见(也更符合 Glide 推荐实践)的结构是:
.
├── glide.yaml
├── glide.lock
├── bin
├── pkg
└── src
└── github.com
└── username
└── myapp
├── main.go
└── vendor # ✅ vendor 位于 src/<import-path>/ 下? 提示:Glide 默认会将依赖安装到 src/<import-path>/vendor/(例如 src/golang.org/x/net/vendor/),但前提是你的项目本身也位于 src/ 下——否则 Glide 的 install 或 update 可能“看似成功”,实则未写入 Go 工具链可识别的位置。
验证是否生效,可在项目内执行:
go env GOPATH # 确认 GOPATH 指向项目根 ls src/myapp/vendor/golang.org/x/net/context # 应存在 go test -v ./... # 此时应能正常解析 vendor 中的包
⚠️ 注意事项:
- Go 1.6+ 的 vendor 机制 不依赖 GOPATH 外的 vendor 目录,即使设置了 GO15VENDOREXPERIMENT=1(旧版环境变量)也无效;
- 不要将 vendor/ 放在 GOPATH 根、bin/ 或 pkg/ 中——这些路径均被 Go 忽略;
- 若使用模块(Go 1.11+),vendor 机制由 go mod vendor 管理,且 GO111MODULE=on 时 GOPATH 不再影响 vendor 查找,但本例属于传统 GOPATH 模式,务必遵守上述路径规范。
总结:vendor 目录不是“全局插件”,而是基于包导入路径的局部依赖快照。它的有效性完全取决于是否嵌套在 $GOPATH/src/<import-path>/ 的合法包树中。调整目录结构后,无需额外配置,Go 1.6.2 即可自动识别并优先使用 vendor 中的依赖。

















