离线机上go mod download报proxy.golang.org: no such host,需在有网且go版本一致的机器预拉取依赖:执行go mod tidy和go mod download -x确认模块落盘至$gopath/pkg/mod/cache/download/,再打包该目录;离线机设goproxy=direct和gosumdb=off,并确保路径结构一致。

离线机上 go mod download 报 proxy.golang.org: no such host 怎么办
这不是网络配置问题,是 Go 默认行为——只要 GO111MODULE=on(Go 1.16+ 默认开启),go mod download 就会硬编码访问 proxy.golang.org 和 sum.golang.org。断网时 DNS 解析失败,直接卡死或报错。
真正要做的不是“修复”这个命令,而是绕过它:在有网、且 Go 版本与目标机**完全一致**的机器上,提前执行:
-
go mod tidy—— 确保go.mod和go.sum已提交、无未暂存修改 -
go mod download -x—— 加-x可看到所有模块实际落盘路径,重点确认它们都进了$GOPATH/pkg/mod/cache/download/ - 若项目含
replace到私有 Git 地址(如github.com/internal/lib => ./local/lib),需同步拷贝该目录,否则离线构建时找不到源码
打包依赖缓存时该选 $GOPATH/pkg/mod/cache 还是 download/ 子目录
只打包 $GOPATH/pkg/mod/cache/download/ 目录就够了。整个 cache/ 包含 cache/、keep/、tmp/ 等子目录,但只有 download/ 存放已验证的模块 zip 和校验文件;其他目录是临时或索引用,离线时无效,还可能因跨平台复制损坏换行符导致 checksum mismatch。
拷贝后,在离线机上确保路径结构完全一致:/root/go/pkg/mod/cache/download/(若 GOPATH=/root/go)。别用 go clean -modcache 清掉它——那是你唯一能用的缓存。
离线构建时必须设的两个环境变量是什么
GOPROXY=direct 和 GOSUMDB=off 缺一不可。
GOPROXY=direct 告诉 Go 不走任何代理,直接从模块原始 URL(如 https://github.com/golang/net)拉取——但离线时这步其实被跳过,因为缓存已就位;而 GOSUMDB=off 才是关键:它禁用校验服务器查询,否则 Go 仍会尝试连 sum.golang.org 验证哈希,报超时或 TLS 错误。
设置方式必须是:
-
go env -w GOPROXY=direct(不是""或off,direct是唯一有效值) -
go env -w GOSUMDB=off(设为""会 fallback 到默认值,依然联网)
go mod vendor 能替代缓存打包吗
不能完全替代。它把依赖复制进 vendor/,编译时确实不联网,但有三个硬伤:
- 不包含
replace指向的本地路径模块(比如replace github.com/foo/bar => ./bar),这些仍需手动同步 - 不处理
// indirect标记的间接依赖,go build时可能仍去查$GOPATH/pkg/mod导致失败 - vendor 后仍需目标机具备 cgo 工具链(
gcc、pkg-config),而纯缓存方案对 ARM64 麒麟等国产系统更友好
如果非要 vendor,顺序必须是:go mod tidy → go mod vendor → 检查 vendor/modules.txt 是否覆盖 go.sum 全部条目。但备份缓存仍是更通用、更少坑的选择。
go.sum 拷过去,checksum mismatch 就跟着来了。别信“差不多就行”,得逐行核对。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











