
Go 1.5+ 默认启用 vendor 机制,但仅当项目位于 $GOPATH/src/ 的合法子目录下时才会生效;直接将代码放在 $GOPATH/src/ 根目录会导致 vendor 被忽略。
go 1.5+ 默认启用 vendor 机制,但仅当项目位于 `$gopath/src/
在 Go 中,vendor 目录的自动识别依赖于模块导入路径(import path)与文件系统路径的一致性。Go 工具链会根据 main.go 所在位置推断其完整导入路径,并据此决定是否启用 vendor 查找。关键规则是:
✅ 有效结构(vendor 生效):
$GOPATH/src/github.com/yourname/myapp/ ├── main.go // import path: "github.com/yourname/myapp" ├── vendor/ │ └── gopkg.in/alecthomas/kingpin.v2/
❌ 无效结构(vendor 被忽略):
$GOPATH/src/ ← 错误!此处无合法 import path ├── main.go // Go 无法推断其 import path,视为“无路径” ├── vendor/ // 因此 vendor 机制不触发
你当前的项目布局正是后者:main.go 直接置于 $GOPATH/src/ 下(通过 set GOPATH=...;c:\Users\js\dev\go 并 cd src 后执行),导致 Go 认为该代码不属于任何可导入包,从而跳过 vendor 解析,转而只搜索 $GOROOT/src 和 $GOPATH/src 全局路径——自然找不到依赖。
✅ 正确做法:遵循标准 Go 工作区约定
-
创建符合导入路径的子目录(例如使用真实或模拟的域名/组织名):
> mkdir C:\Users\js\dev\my_project\rest\src\myapp > move C:\Users\js\dev\my_project\rest\src\main.go C:\Users\js\dev\my_project\rest\src\myapp\ > move C:\Users\js\dev\my_project\rest\src\vendor C:\Users\js\dev\my_project\rest\src\myapp\
-
确保 main.go 顶部声明匹配路径的包导入语句(通常无需显式写 import "myapp",但需保证结构一致):
// myapp/main.go package main import ( "gopkg.in/alecthomas/kingpin.v2" // 依赖将从 vendor/ 解析 "fmt" ) func main() { fmt.Println("Running with vendored dependencies") } -
在项目根目录(即 myapp/)下运行命令:
> cd C:\Users\js\dev\my_project\rest\src\myapp > go run main.go // ✅ vendor 正常生效
⚠️ 注意事项:
- Go 1.11+ 推荐使用 Go Modules(go mod init)替代 GOPATH + vendor,完全规避路径约束;
- 即使使用 GOPATH 模式,也禁止将项目代码直接放在 $GOPATH/src/ 根目录——它仅作为包注册根,不是代码存放区;
- godeps 等旧工具生成的 vendor/ 必须与 main.go 处于同一逻辑包路径下才被识别。
总结:Go 的 vendor 机制并非“只要存在 vendor 目录就自动启用”,而是严格绑定于导入路径驱动的包发现逻辑。修正项目结构,使其符合 src/










