离线Go构建必须预拉取完整依赖缓存并严格配置环境:在同版本联网机执行go mod tidy和go mod download -x确认$GOPATH/pkg/mod/cache/download/目录完备,打包该目录;离线机设GOPROXY=direct、GOSUMDB=off、GO111MODULE=on,确保路径与缓存结构一致。

离线构建前必须确认 go.mod 和 go.sum 已冻结
没提交的本地修改、未 commit 的 go.mod 或临时 replace 语句,会导致离线机拉取的依赖和实际需要的不一致。尤其注意 // indirect 标记的模块是否已被显式 require —— 否则 go mod download 可能跳过它们。
- 在联网机器上运行
go mod tidy,再检查go.sum是否完整(行数应与 CI 构建日志一致) - 执行
go mod download -json,输出里每个模块都应有Dir字段,且路径指向$GOPATH/pkg/mod/cache/download/下真实存在的 zip 文件 - 若项目含
replace github.com/internal/lib => git@xxx:/path,必须先git clone对应仓库,并用go mod edit -replace=github.com/internal/lib=./internal/lib改为相对路径
离线机必须设 GOPROXY=direct 且 GOSUMDB=off
这两个环境变量不是可选配置,而是硬性开关。设成空字符串(GOPROXY="")或 off 都不行——GOPROXY=direct 才表示“不走代理,直接查本地缓存”,GOSUMDB=off 才彻底禁用校验和远程验证。
- 执行
go env -w GOPROXY=direct GOSUMDB=off GO111MODULE=on,确保写入用户级配置 - 验证:运行
go env GOPROXY GOSUMDB,输出必须是direct和off - 如果用 systemd 或 Jenkins,需在启动脚本开头显式
export GOPROXY=direct GOSUMDB=off,否则子进程可能继承默认值
依赖缓存目录必须完整拷贝且路径匹配
$GOPATH/pkg/mod/cache/download/ 是唯一被 Go 工具链信任的离线来源。只拷贝 vendor/ 目录或只打包 go.mod 不够——go build 在 module mode 下仍会去这个路径查 zip 和 info 文件。
在 Golang 中使用 samber/hot 进行内存缓存,支持 LRU、LFU、TinyLFU、W‑TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFO 等淘汰算法,提供 TTL、缓存加载器及分片功能。
- 在联网机器上,用与目标环境**完全一致的 Go 版本**(如
go1.24.5)执行go mod download -x,观察最后一行是否显示downloaded且无报错 - 打包整个
$GOPATH/pkg/mod/cache/download/目录(不是cache/上层),保留原始目录结构,解压到离线机相同路径 - 若离线机构建时报
cannot find module providing package,大概率是download/下缺某个模块的.zip或.info文件,回联网机重新go mod download并比对go list -m all输出
go build -mod=vendor 不等于离线安全
go build -mod=vendor 看似绕过网络,但前提是 vendor/modules.txt 与 go.mod、vendor/ 目录三者严格一致。只要有一处不匹配,Go 就 fallback 到 module mode 并尝试联网。
立即学习“go语言免费学习笔记(深入)”;
- 执行
go mod vendor -v,检查输出中是否有(not in vendor)行——这类包不会进vendor/,但构建时仍需从download/加载 -
vendor/不包含测试依赖(_test.go引用的包)、不处理//go:embed文件、也不 vendorreplace前的原始路径 - 更稳妥的做法是:离线机上直接
go build(不加-mod=vendor),靠GOPROXY=direct+ 完整download/缓存驱动,而非依赖vendor的脆弱一致性
go.mod 里某一行 replace 指向了未同步的私有路径,或者 download/ 目录里少了一个 golang.org/x/sys@v0.25.0.info 文件——这种缺失不会报明确错误,只会让 go build 卡在 “verifying” 阶段几秒后静默失败。

















