go mod vendor本身不生效,必须配合-mod=vendor才启用vendor模式;最常见失败原因是go111module≠on或缺失go.mod,导致目录为空或未生成;vendor仅收录当前构建实际所需包,非go.mod全部依赖,且需goflags="-mod=vendor"或每次构建显式指定参数才能真正启用。

go mod vendor 本身不生效,必须配合 -mod=vendor 才真正启用 vendor 模式;否则即使目录存在,go build 仍走模块缓存或网络。
go mod vendor 命令为什么执行后 vendor 目录为空或根本没生成
最常见原因是环境未就绪,不是命令错了:
-
GO111MODULE不是on(尤其在 GOPATH 路径下默认为auto或off),运行go env GO111MODULE确认输出是on - 当前目录没有
go.mod文件,或不在模块根目录(比如在子包里执行,但go.mod在上级) - 运行了
go mod vendor却没提前跑过go mod tidy,导致go.mod里依赖不全,vendor 就无从复制 - 私有仓库未配置
GOPRIVATE,命令中途静默失败,vendor 目录只建了个空壳
构建时怎么让 Go 真正用上 vendor 里的代码
光有 vendor/ 目录完全不够。Go 1.14+ 默认忽略它,必须显式告诉工具链:
- 每次构建加参数:
go build -mod=vendor、go test -mod=vendor、go run -mod=vendor main.go - 设全局环境变量(推荐 CI 场景):
GOFLAGS="-mod=vendor",之后所有 go 命令自动带上该 flag - 验证是否生效:加
-x参数看编译日志,例如出现compile [vendor/golang.org/x/net/http2]才算成功 -
go list -mod=vendor ./...可检查 vendor 是否覆盖全部构建所需包,对比go list all的数量
vendor 目录里为什么缺某些包,比如测试依赖或条件编译包
vendor 只收录「当前构建目标实际需要」的包,不是 go.mod 里所有 require 都进 vendor:
- 仅在
_test.go中 import 的包(如gotest.tools/v3),用go build不会拉入 vendor;需运行go test -mod=vendor才触发收录 - 带
// +build ignore或//go:build !linux这类标签的文件,若当前构建平台不匹配,对应依赖也不会进 vendor -
replace指向本地路径(如replace example.com/a => ./local/a)会被复制进去,但远程replace(如指向另一个 git tag)仍按原模块处理 - vendor 不清理旧包——删掉
go.mod里的依赖后,go mod vendor不会自动删 vendor 里残留的代码
离线构建失败,但 vendor 目录明明存在
真正卡住的往往不是 vendor 本身,而是 Go 工具链其他环节仍在偷偷联网:
- 确保
GOPROXY=off和GOSUMDB=off已设置,否则go list、go mod download等命令仍会连 proxy.golang.org -
go.sum必须完整且与 vendor 内容一致;手动改过 vendor 里的文件,或go.sum被清空,都会触发checksum mismatch错误 - 别只同步
vendor/——离线环境必须打包整个项目目录,含go.mod、go.sum、vendor/三者缺一不可 - 某些工具(如
gopls)默认不读 vendor,IDE 报错但go build -mod=vendor能过,这是正常行为,不用强求编辑器对齐
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











