内网机器执行go mod download卡住或报错connection refused,根本原因是模块代理不可达,需设goproxy为内网goproxy地址并关闭gosumdb校验。

内网机器执行 go mod download 卡住或报错 connection refused
这不是 Go 安装失败,而是模块代理不可达。Go 1.13+ 默认走 https://proxy.golang.org,内网直连必然超时或拒绝连接。
- 临时验证:运行
go env -w GOPROXY=direct,再试go mod download—— 若仍失败,说明连源码仓库(如 Git)也访问不了,direct模式无效 - 真正可用的方案是部署内网代理:用一台能出网的机器起
goproxy(轻量、单二进制),监听0.0.0.0:8081,内网其他机器设go env -w GOPROXY=http://10.1.2.3:8081(替换为实际 IP) - 必须同步关校验:
go env -w GOSUMDB=off,否则go build阶段仍会尝试连sum.golang.org,同样卡住
go install 后命令找不到,但 go version 正常
常见于解压路径和环境变量不匹配,尤其在批量部署时容易漏掉 PATH 导出。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 确认
go二进制位置:比如解压到/opt/go,则/opt/go/bin必须在PATH中 - 别只改
~/.bashrc:CI 构建机或 systemd 服务通常不读用户 shell 配置,应写入/etc/profile.d/golang.sh,内容为export PATH="/opt/go/bin:$PATH" - 检查
GOBIN:若设了GOBIN,go install会把二进制放那里,而非默认的$GOPATH/bin;没设时,确保$GOPATH/bin(通常是~/go/bin)也在PATH里
CI 流水线里 go mod vendor 结果不一致
go mod vendor 不是“复制所有依赖”,它只拉取 go list -m all 解析出的模块,且默认忽略测试依赖、replace 到本地路径的模块(除非该路径存在且可读)。
- 前置清理:每次 vendor 前先跑
go mod tidy -v,删掉go.mod里残留的未引用模块 - 加
-v参数:用go mod vendor -v,否则静默失败时根本不知道哪个replace的内网 Git 地址连不上 - CI 环境禁用代理:在构建脚本开头明确设
GOPROXY=direct GOSUMDB=off,避免因环境变量继承导致意外走外网代理
GOROOT 和 GO111MODULE 设置不当导致本地能跑、CI 报错
内网 CI 通常用干净容器或最小系统镜像,不会继承开发机的环境变量,显式配置缺一不可。
-
GOROOT要显式设:即使解压路径标准(如/usr/local/go),也建议go env -w GOROOT=/usr/local/go,某些旧版 Jenkins 插件或 IDE 远程调试会读这个值 -
GO111MODULE统一为on:遗留项目若没go.mod,go build会自动生成,配合GOPROXY可控;设auto在 CI 里行为不稳定(依赖当前目录是否有go.mod) - 别碰
GOPATH:Go 1.16+ 已无需显式设置,设了反而干扰模块查找逻辑;只需保证$GOPATH/bin在PATH,因为go install默认往那儿写
go mod 在无网络、无 DNS、无证书信任链的环境下稳定 resolve 依赖 —— 每个环节都得显式接管,不能依赖默认行为。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










