Go vendoring 机制通过将依赖复制到 vendor/ 目录实现隔离与可重现构建,Go 1.11+ 需用 -mod=vendor 标志或 GOFLAGS 启用,配合 go mod vendor 管理,vendor/ 应提交至 Git。
Go 的 vendoring 机制(从 Go 1.5 引入,Go 1.6 默认启用,Go 1.11+ 后被 go mod 取代但依然兼容)允许你将项目依赖的第三方包完整复制到项目目录下的 vendor/ 文件夹中,实现依赖隔离和构建可重现性。虽然现在主流使用 Go Modules,但在某些受限环境(如离线构建、旧版 Go、CI/CD 要求锁定全部依赖路径)中,vendoring 仍有实际价值。
运行 go version 确保是 Go 1.5–1.10(原生 vendor 支持最稳定),或 Go 1.11+(需显式启用 vendor 模式)。Go 1.11+ 默认使用 modules,要启用 vendor 行为,需确保:
go.mod 文件(即使空文件也可)-mod=vendor 标志,例如:go build -mod=vendor
GOFLAGS="-mod=vendor"(全局生效)如果你用的是 Go Modules(推荐方式),可通过以下步骤生成 vendor 目录:
go mod init your-module-name
go mod vendor:该命令会读取 go.mod 和 go.sum,将所有直接/间接依赖复制到 vendor/ 下,并生成 vendor/modules.txt(记录 vendor 内容来源)ls ve
ndor/ 应看到按路径组织的依赖包(如 github.com/sirupsen/logrus)仅把包放进 vendor/ 不代表编译器自动使用它。必须显式告知 Go 工具链优先从 vendor 加载:
go build -mod=vendor
go test -mod=vendor ./...
-mod=vendor,避免误用 GOPATH 中的版本若省略 -mod=vendor,Go 仍会走 module 模式(从 $GOPATH/pkg/mod 或 proxy 下载),vendor/ 将被忽略。
vendor 不是一次性操作,需随依赖变更同步更新:
go get xxx(会写入 go.mod),再运行 go mod vendor
go get xxx@v1.2.3 → go mod vendor
go mod tidy(修正 go.mod)→ go mod vendor
go.mod 一致:go mod vendor -v(显示差异)或 go mod verify
注意:vendor/ 是可提交到 Git 的——它本质是你项目的一部分,应和源码一起版本化。