离线机上go mod download必然失败,因go 1.16+硬编码访问proxy.golang.org和sum.golang.org,断网时dns解析直接报错“no such host”,无法执行下载;必须在联网机预拉取并配置goproxy=direct和gosumdb=off。

必须用 go mod download -x 在联网机预拉取,离线机设 GOPROXY=direct 和 GOSUMDB=off,否则 go build 仍会卡在 DNS 解析或校验阶段。
为什么 go mod download 在离线机上一定失败
Go 1.16+ 默认开启 GO111MODULE=on,所有模块操作(包括 go mod download)硬编码访问 proxy.golang.org 和 sum.golang.org。断网时不是超时,而是 lookup proxy.golang.org: no such host —— DNS 层直接失败,命令卡死或报错退出。
这不是代理配置错误,也不是网络设置问题,是 Go 工具链的默认行为。你不能在离线机上“运行一次命令就搞定”,只能提前在联网机上把依赖完整落盘。
- 必须用与目标离线机完全一致的 Go 版本执行下载(如都是
go1.24.5),否则go.sum校验和、// indirect判断可能不兼容 - 执行
go mod download -x,观察输出中每个GET请求对应的本地路径,确认golang.org/x/等关键扩展包也已落盘 - 只拷贝
$GOPATH/pkg/mod/cache/download/目录(不是整个cache/),它才是 Go 唯一信任的离线来源
GOPROXY=direct 和 GOSUMDB=off 必须同时生效
GOPROXY=off 或空字符串无效:Go 会 fallback 到默认值;GOSUMDB="" 也不行,它仍尝试连接 sum.golang.org。只有 GOPROXY=direct 表示“不走代理,只查本地缓存”,GOSUMDB=off 才彻底禁用远程校验。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 用
go env -w GOPROXY=direct GOSUMDB=off GO111MODULE=on写入用户配置 - 验证:运行
go env GOPROXY GOSUMDB,输出必须严格是direct和off - 若在 systemd、Jenkins 或 cron 中构建,需在启动脚本开头显式
export GOPROXY=direct GOSUMDB=off,否则子进程继承默认值
构建命令必须加 -mod=readonly 或 -mod=vendor
即使缓存完整,go build 默认仍可能尝试更新 go.sum 或检查间接依赖,触发网络行为。不加参数等于没关严。
- 推荐用
go build -mod=readonly:强制只读模式,任何需要修改go.mod或go.sum的操作都会报错,彻底杜绝意外联网 - 若用了
go mod vendor,则必须确保vendor/modules.txt与go.sum完全匹配(可用diff vendor/modules.txt 验证) - 避免用
-mod=mod或不指定,这是默认值,也是最危险的——它允许自动写go.sum,一旦缺校验项就会去联网补
私有模块和 replace 的处理最容易漏
go mod download 不处理 replace 到私有 Git 地址(如 github.com/internal/lib => git@xxx:/path)或本地路径(如 ./internal/mylib)。这些模块不会进 download/,离线构建时直接报 cannot find module providing package。
- 在联网机上,先
git clone对应仓库,再用go mod edit -replace=github.com/internal/lib=./internal/mylib改为相对路径 - 确保该本地目录真实存在且已提交到项目中(不是 .gitignore 掉的),否则离线机找不到源码
- 若项目含 cgo 依赖(如
github.com/mattn/go-sqlite3),还需确认离线机构建时已安装对应 C 工具链和头文件,否则报cannot find -lc类错误
真正离线不是“没报错”,而是从 go mod download 到 go build 全程无任何域名解析、TCP 连接尝试。最可靠的验证方式:在离线机上 tcpdump -i any port 53 or port 443 后运行构建命令,确认零包发出。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










