go mod tidy报错missing go.sum entry与module lookup disabled by GOPROXY=off的解决方法(GOPROXY镜像、GOPRIVATE与校验数据库配置)

go mod tidy或者go build卡住不动,十有八九卡在下载依赖那一步。报错串基本能分成三类:连不上代理、校验不过、配置把下载通道给关了。先把报错原文看清楚再动手,比反复重试快得多。

先确认这台机器到底在用哪套配置:

go version
go env GOPROXY GOSUMDB GOPRIVATE GOMODCACHE GOFLAGS

默认值是GOPROXY=https://proxy.golang.org,direct,这个地址在国内多数网络环境下要么超时,要么直接连接被重置。


下载超时:换模块代理

最常见的原文是dial tcp后面跟一个IP和443,末尾i/o timeout,或者干脆长时间停在go: downloading那一行不动。换一个能连上的模块代理就行:

go env -w GOPROXY=https://goproxy.cn,direct

末尾那个direct不能丢。它的意思是镜像上查不到(HTTP 404或410)时回源到版本控制系统去取,私有模块和很新的tag都靠它兜底。写多个用逗号分隔,按顺序试:

go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,direct

go env -w会把配置写进go env GOENV指向的那个文件,Linux在~/.config/go/env,Windows在%APPDATA%\go\env,一次设置长期有效。临时换用环境变量即可:GOPROXY=https://goproxy.cn,direct go mod tidy。要撤销写过的配置用go env -u GOPROXY。

校验数据库不用单独改。国内这几个公开镜像都支持代理sumdb的查询请求,换了GOPROXY之后校验也会跟着走镜像,只有镜像本身不支持时才需要把GOSUMDB指定成sum.golang.google.cn。


module lookup disabled by GOPROXY=off

看到这句,说明有人把下载通道显式关掉了:

go: github.com/gin-gonic/gin@v1.9.1: module lookup disabled by GOPROXY=off

见过不少Dockerfile为了"加速构建"直接写ENV GOPROXY=off,结果基础镜像里没有预置的模块缓存,构建第一步就死在这儿。两种正当用法:确实要离线构建,先把依赖打进vendor目录:

go mod vendor
go build -mod=vendor ./...

或者明确允许联网,把off改回镜像地址。


missing go.sum entry:不是网络问题

这条报错的原文长这样:

missing go.sum entry for module github.com/gin-gonic/gin; to add it:
    go mod download github.com/gin-gonic/gin

Go从1.16起把-mod的默认值改成了readonly,go build不再自动帮着改go.mod和go.sum,缺东西就直接报错退出。照提示补上:

go mod download github.com/gin-gonic/gin
go mod tidy

老项目从GOPATH模式迁上来时,go.mod里写的go版本偏低也会连带出问题。Go 1.22.0、1.23.0、1.24.0、1.25.0、1.26.0,这几个版本对模块图裁剪的处理并不一样,1.17.0之后的模块只记录直接相关的依赖哈希,跨大版本升级时go.sum经常需要整体重跑一遍tidy。已知的版本是Go 1.26.0发布于2026年2月10日,1.25.0发布于2025年8月12日。

确实需要临时回到"自动补"的行为,用环境变量限定这一次命令即可,别全局写死:

GOFLAGS=-mod=mod go mod tidy


私有模块:用GOPRIVATE,别拿GOSUMDB=off当万能药

公司内部的Git仓库拉不下来,或者报SECURITY ERROR说下载内容与校验数据库记录不一致,正确做法是声明这些路径是私有的:

go env -w GOPRIVATE=git.example.com/*,github.com/mycorp/*

GOPRIVATE是GONOPROXY与GONOSUMDB这两个变量的默认值,一次设置同时解决"不走代理直连Git"和"不送校验数据库比对"两件事。反过来,把GOSUMDB设成off是把所有依赖(包括公开依赖)的透明度日志校验一起关掉,等于把供应链上的一道防线全拆了,属于为了修一个私有模块的问题把整台机器的安全级别降下去。

私有仓库还要能通过HTTPS或SSH取到代码。走SSH的,在~/.gitconfig里加上:

[url "git@git.example.com:"]
    insteadOf = https://git.example.com/


缓存坏了:checksum mismatch

报verifying module: ... checksum mismatch时,先别急着怀疑被人投毒。遇到过多次的情况是模块缓存里的zip是半截的,上次下载被中断,文件却留在缓存里,下次直接拿去校验。清掉重下:

go clean -modcache
go mod download all
go mod verify

go mod verify会重新算一遍缓存里所有模块的哈希并与go.sum比对,全通过会打印all modules verified。实测下来,网络不稳定环境里的checksum mismatch有八成是缓存问题,清缓存比查网络有效。

CI上想看清楚到底在跟谁通信,把-v和-x加上:

go mod tidy -v
go build -x ./...


版本号与发布日期截至2026年9月。国内环境下的配置建议就是两条:GOPROXY写goproxy.cn加direct兜底,私有路径交给GOPRIVATE,剩下的报错再按上面的分类逐个查。