局域网断网时go mod download卡住或报no such host,因Go默认仍尝试连接proxy.golang.org和sum.golang.org;须显式设GOPROXY=direct且GOSUMDB=off,并确认GO111MODULE=on。

局域网断网时 go mod download 为什么卡住或报 no such host
因为 Go 默认仍会尝试连接 proxy.golang.org 和 sum.golang.org,哪怕你没配 GOPROXY。断网后 DNS 解析失败或 TCP 连接超时,就表现为 no such host、dial tcp: i/o timeout 或卡在 verifying 阶段。
-
GOPROXY=direct必须显式设置:它让 Go 跳过所有代理,直接按go.mod里写的原始 URL(如https://github.com/golang/net)去拉——但注意,这只是“不走 proxy”,不代表它真能连上;实际是否成功,取决于你本地能否访问那些地址 -
GOSUMDB=off同样关键:否则 Go 仍会尝试请求sum.golang.org校验哈希,断网必失败 -
GO111MODULE=on要确认开启:老脚本或 CI 环境可能关着,导致go mod命令不生效 - 验证方式:运行
go env GOPROXY GOSUMDB GO111MODULE,输出应为direct off on
go mod vendor 能不能真正离线构建
能,但有硬性前提和常见漏点:它只打包 go list -m all 解析出的模块,不自动处理 replace、测试依赖、C 语言头文件或间接依赖残留。
- 执行前必须先
go mod tidy:清理掉未引用的require,否则vendor/里会混入无用模块,甚至因版本冲突导致编译失败 - 加
-v参数:go mod vendor -v可看到每个包是否成功复制;静默模式下某私有模块拉不到也不会报错,只留空目录 - 私有
replace必须提前转成本地路径:比如replace git.corp.internal/lib => ./vendor/lib,否则vendor不包含它 -
vendor/modules.txt要和go.sum条目数一致:少一条就说明漏了依赖,别只看文件体积
离线构建时 go build 报 checksum mismatch 怎么办
这不是网络问题,是本地缓存或 go.sum 文件本身出错。断网环境下,校验失败几乎都源于哈希值与实际文件内容不匹配。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 检查
go.sum行尾是否有 Windows CRLF 换行符或多余空格:用file go.sum看编码,或xxd go.sum | head查 \r\n - 别用
go clean -modcache:它会清掉你辛苦带进来的全部预下载依赖;优先用go mod verify定位具体哪个模块哈希不匹配 - 临时绕过仅限调试:
go build -mod=readonly -modcacherw,但必须确保go.sum是从可联网机器完整同步过来的 - 若私有模块走 Git,确认域名已加进
GOPRIVATE:比如go env -w GOPRIVATE=*.corp.internal,否则 Go 仍会试图走 proxy 校验
要不要自建内网 goproxy 服务
取决于团队规模和构建频率。单人开发或 CI 构建不频繁时,go mod vendor 更轻量可靠;5 人以上且每天多次构建,搭一个 goproxy 实例能显著减少重复下载和 vendor 目录膨胀。
立即学习“go语言免费学习笔记(深入)”;
- 启动命令要带
-cache-dir和上游-modules:例如goproxy -modules="https://goproxy.cn" -cache-dir="/data/goproxy-cache" - 局域网机器设
GOPROXY=http://192.168.1.100:8080,direct:逗号后保留direct,确保私有模块不走代理 - 它不缓存私有模块:
GOPRIVATE域名下的包仍需内网 Git Server 可达,goproxy不解决这部分 - 注意证书:如果用 HTTPS 反向代理,客户端要信任该证书,否则
go get会报x509: certificate signed by unknown authority
go.mod 里一行 // indirect 注释被手动删了,会导致 go mod vendor 漏掉某个传递依赖;又比如 GOPATH 设在 /home/user/go,但 CI 用 root 用户跑,go install 就写到错目录。这些细节不验证,上线前才暴露。

















