GoLand必须手动开启Vendoring mode才能识别vendor目录,否则即使存在vendor/仍走pkg/mod或代理;需确保vendor/modules.txt存在,并在构建时显式使用-go build -mod=vendor。

GoLand 必须手动开启 Vendoring mode 才识别 vendor/
GoLand 默认不启用 vendor 模式,即使项目根目录下有 vendor/ 目录,IDE 仍会走 $GOPATH/pkg/mod 缓存或远程代理(比如卡在 proxy.golang.org),不会报错,只无限等待——这是离线环境最常被忽略的卡点。
必须进设置显式开启:
- Settings → Go → Go Modules → 勾选 Vendoring mode
- 确保 Enable Go modules integration 保持开启(这是前提,关了就退回到 GOPATH 旧模式)
- 改完后重启 GoLand 或点击右上角
Reload project图标
go mod vendor 生成的 vendor/ 必须含 modules.txt
go mod vendor 命令本身不保证 vendor 生效,关键看生成结果里有没有 vendor/modules.txt。这个文件是 Go 工具链识别 vendor 是否“已正确冻结”的唯一元数据,缺了它,-mod=vendor 会直接失败或静默回退。
生成前确认:
立即学习“go语言免费学习笔记(深入)”;
- 当前目录有
go.mod(没有就先go mod init example.com/myproj) - 执行
go mod tidy确保依赖树干净、go.sum同步 - 再执行
go mod vendor,检查输出末尾是否出现Writing vendor/modules.txt - 手动查看:
ls vendor/modules.txt—— 没这个文件,说明 vendor 未真正生成成功
构建命令必须加 -mod=vendor,否则 vendor 形同虚设
即使 GoLand 开启了 Vendoring mode,终端里跑 go build 或 go test 时,仍默认忽略 vendor/,继续读 pkg/mod。你得显式告诉 Go:「这次只信本地」。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
所有构建命令都必须带参数:
go build -mod=vendorgo run -mod=vendor main.gogo test -mod=vendor ./...- CI/CD 脚本里漏掉这个,就会出现“本地能过、流水线失败”
也可以设环境变量一劳永逸:GOFLAGS=-mod=vendor,但注意它会影响所有 go 命令(包括 go mod 系列),慎用。
replace 和 exclude 规则在 vendor 中不生效
go.mod 里的 replace(比如指向本地路径或私有 fork)和 exclude 不会被 go mod vendor 处理。它只按最终解析出的模块路径 + 版本号去拉取原始包,不会把 replace ../myfork 也拷进去。
若你依赖的是本地修改版,得先用 go mod edit -replace 把 replace 指向一个真实 commit hash,再 go get 拉下来,最后 go mod vendor —— 否则 vendor 里还是原始代码。
检查是否生效最简单的方法:go list -m all | grep your-module 和 ls vendor/your-module-path 输出应一致;不一致,说明 vendor 没真正覆盖。
vendor 不是“一键隔离”,它是快照,不是魔法。最容易被绕过的点永远是:没开 IDE 设置、没生成 modules.txt、构建漏 -mod=vendor、以及误以为 replace 会进 vendor。

















