换了台新机器,go mod tidy 一直卡在 downloading,十分钟没动静。go env 里 GOPROXY 还是空的,等于直连 proxy.golang.org,国内基本拉不动。
设置只有一行,但要连带看三个变量,少一个都可能白配。
GOPROXY 要带 direct 兜底
go env -w GOPROXY=https://goproxy.cn,direct逗号后面那个 direct 表示代理返回 404 或者 410 时回源直连,不加的话私有模块一律拉不到。多个代理可以继续用逗号接,前面的失败才走后面。
选镜像也有讲究,goproxy.cn 和 goproxy.io 都是常用地址,公司里有人图快抢配一个已停服的地址,报错全是 dial tcp 超时,看着像网络问题,其实是代理本身没了。
GOSUMDB 和 GOPRIVATE 别混
校验库默认是 sum.golang.org,国内访问不稳,可以换成国内的镜像,或者把公司私有仓库写进 GOPRIVATE,避免校验时又出去转一圈。
go env -w GOPRIVATE=*.corp.example.comGOPRIVATE 同时影响代理和校验,设了之后这些域名不走 GOPROXY,直接按 git 配置拉。私库要求 SSH 的,还得确认 git 的 insteadOf 配置对得上,否则会退回去要账号密码,CI 里直接卡住。
设置不生效的几种情况
- 只改了当前 shell 的 export,IDE 里跑的还是老环境,用 go env -w 写进配置文件才全局有效。
- 公司网络有透明代理,HTTPS 被拦,go 报证书错误,这时该找网管加白名单,别用 GOINSECURE 硬闯。
- GO111MODULE 设成 off 的老项目,压根不看 GOPROXY。
改完用 go env GOPROXY 确认一遍,再 go clean -modcache 清缓存重拉。缓存坏了的表现很怪,同一个包别人能编,你这里一直校验失败,清了通常就好。
企业内网更省事的做法是自建 goproxy 或者用 Nexus 的 go 仓库,一次配好,全组不用各改各的。项目里有 vendor 目录的,加 -mod=vendor 就完全不联网,代理配不配都无所谓。