
Go语言默认将go get下载的包存入GOROOT/src或GOPATH/src,但可通过启用模块模式(Go 1.11+)并配合go mod vendor命令,将依赖统一复制到项目本地vendor/目录,实现代码与第三方包完全隔离。
go语言默认将go get下载的包存入goroot/src或gopath/src,但可通过启用模块模式(go 1.11+)并配合go mod vendor命令,将依赖统一复制到项目本地vendor/目录,实现代码与第三方包完全隔离。
在 Go 1.11 及之后版本中,官方已推荐使用 Go Modules(模块系统)替代传统的 GOPATH 工作流,这正是解决“第三方包污染 src 目录”问题的标准方案。你无需手动创建 src/vendor 结构(该路径在模块模式下已过时且无效),而应直接在项目根目录启用模块并生成 vendor 目录。
✅ 正确操作步骤如下:
-
初始化模块(在你的项目根目录执行):
go mod init myproject
这会生成
go.mod文件,声明模块路径。立即学习“go语言免费学习笔记(深入)”;
-
添加依赖(自动下载并记录到
go.mod):go get github.com/go-zoo/bone
此时包仍缓存在
$GOPATH/pkg/mod(模块缓存区),不会写入src/—— 这是模块模式的核心优势。 -
生成 vendor 目录(可选,仅当需完全离线或锁定依赖时):
go mod vendor
该命令会将所有依赖包精确复制到项目根目录下的
vendor/子目录中,结构为vendor/github.com/go-zoo/bone,与你的源码(如main.go)同级。 -
编译/运行时启用 vendor 模式(确保使用 vendor 中的包):
go build -mod=vendor # 或 GOFLAGS="-mod=vendor" go run main.go
⚠️ 注意事项:
- 不要手动在
src/下建vendor;Go Modules 的vendor/必须位于模块根目录(即含go.mod的目录)。 -
go mod vendor生成的依赖版本严格对应go.mod和go.sum,保障可重现构建。 - 工具如
govend已基本被原生go mod vendor取代,无需额外引入;现代 Go 开发应优先使用官方模块机制。
总结:告别 GOPATH 时代的 src/ 依赖混杂,拥抱 Go Modules —— 它让“我的代码在项目内,依赖在 vendor 中,缓存在线下模块库中”成为清晰、标准、可维护的工程实践。


















