必须同时设置 goproxy=off 和 gosumdb=off 才能彻底离线构建,仅 -mod=vendor 不足以阻止 go list 等内部命令联网;vendor 缺包常因构建平台与 vendor 生成平台不一致或 // +build 标签导致;go.sum 不匹配需确保 go.mod、modules.txt 和 vendor 内容严格一致。

go build -mod=vendor 为什么还是联网失败
根本不是 vendor 目录没生成,而是 Go 工具链在解析依赖图时仍会触网——即使你加了 -mod=vendor,go build 内部调用的 go list 或校验阶段仍默认连 proxy.golang.org 和 sum.golang.org。
- 必须提前设死两个环境变量:
GOPROXY=off且GOSUMDB=off,缺一不可 - 验证是否生效:运行
go env GOPROXY GOSUMDB,输出应为off off - CI 脚本里别只在
go build前 export,要确保所有子命令(如go test、go list)都继承该环境 - 如果用容器,建议在
Dockerfile的ENV指令里直接写死,避免被构建机全局配置覆盖
go mod vendor 生成的 vendor/ 为什么缺包
常见现象是 vendor/github.com/sirupsen/logrus 存在,但构建报 cannot find module providing package github.com/sirupsen/logrus——本质是 go mod vendor 只拷贝它“看得到”的依赖,而某些包被 // +build 标签或平台条件屏蔽了。
- 先清空再重做:
rm -rf vendor/ && go mod tidy && go mod vendor - 按目标离线环境执行 vendor:比如最终部署在 Linux AMD64,就用
GOOS=linux GOARCH=amd64 go mod vendor - 检查是否有
// +build darwin这类标签文件,在当前平台下未被加载,可临时删掉标签测试 - 私有仓库依赖若用
git+ssh协议,go mod vendor可能静默失败,需提前配好GOPRIVATE=*或具体域名
离线构建时 go.sum 不匹配 checksum 怎么办
go.sum 不是摆设,go build -mod=vendor 仍会用它校验 vendor/ 里的源码是否被篡改或版本不一致。报 checksum mismatch 说明本地 go.sum 和 vendor/ 内容对不上。
- 在线环境先跑
go mod verify,补全缺失的校验和条目 - 确保
go.mod和vendor/modules.txt版本完全一致:前者声明版本,后者记录实际 vendored 版本,差一个 patch 都会触发网络请求 - 别只同步
vendor/目录到离线机——必须把整个项目根目录(含go.mod、go.sum、vendor/)一起打包带走 - 如果用了
replace指向本地路径(如replace example.com/a => ./local/a),go mod vendor默认忽略,得手动复制或改用绝对路径 + 提前在离线机上准备好该路径
IDE 或 go run 不走 vendor 怎么办
VS Code 的 gopls、GoLand 的 indexer、甚至 go run main.go 默认都不识别 -mod=vendor,所以提示 “no packages found” 或自动拉公网模块。
-
go run本身不支持-mod=vendor参数,只能先go build -mod=vendor -o app .再执行二进制 - VS Code 需在
settings.json加:"go.toolsEnvVars": {"GOFLAGS": "-mod=vendor"} - GoLand 在 Settings → Go → Build Tags & Vendoring → 勾选 “Use vendor directory”
- 别信 “vendor 目录存在就自动生效” —— Go 1.14+ 后这是设计行为,不是 bug,漏参数就是跳过 vendor
vendor/ 有没有,而是 go.sum 是否完整、GOPROXY 是否真关掉、以及构建命令是否每个环节都带 -mod=vendor。工具链的隐式联网比想象中更隐蔽。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











