模块缓存实际存于gomodcache环境变量指定路径,非固定$gopath/pkg/mod;其真实结构含cache/download下的.zip/.info文件及伪版本解压目录,并通过符号链接关联,需用go clean -modcache安全清理。

模块缓存实际存在哪?别信 $GOPATH/pkg/mod 的表面目录
Go 模块缓存的真实路径由 GOMODCACHE 环境变量决定,不是硬编码的 $GOPATH/pkg/mod。运行 go env GOMODCACHE 才能拿到当前生效路径——它可能等于 $GOPATH/pkg/mod,也可能被显式覆盖为 /data/go-mod-cache 或其他位置。
这个目录下根本看不到干净的 github.com/user/repo@v1.2.3 文件夹。真实结构是分层哈希+伪版本的组合:
-
cache/download/github.com/user/repo/@v/v1.2.3.zip和配套的.info、.mod文件 - 解压后路径类似
github.com/user/repo@v1.2.3-0.20230101000000-abcdef123456(含时间戳与提交哈希) -
github.com/user/repo@v1.2.3是个符号链接,指向上面那个伪版本目录
这意味着:直接 rm -rf github.com/user/repo@v1.2.3 不仅删不干净(.zip 和 .info 还在 cache/download 里),还可能破坏符号链接一致性,导致 go list -m all 显示异常。
go clean -modcache 到底删了什么?哪些东西它故意不动
go clean -modcache 会清空整个 GOMODCACHE 目录下的三类内容:
- 所有
cache/download/下的.zip、.info、.mod和.ziphash文件 - 所有解压后的模块源码目录(含伪版本路径)
- 所有符号链接(如
github.com/user/repo@v1.2.3)
但它明确保留:
- 项目根目录下的
go.mod和go.sum—— 它们定义依赖树,不参与缓存管理 -
vendor/目录(如果存在)——go clean -modcache完全无视它 -
$GOCACHE(编译中间文件)和$GOPATH/bin(安装的二进制)—— 它们是独立缓存域
所以清理后首次 go build 会重新下载所有模块,但不会报错或构建失败;只是慢一点,且完全可预期。
手动删 pkg/mod 的风险在哪?常见误操作直击
手动 rm -rf $GOPATH/pkg/mod 表面看“清得更彻底”,实则埋下多个隐患:
- 残留软链接状态丢失:若你用过
go mod edit -replace或require ./local,这些本地替换关系靠符号链接维持,手动删会断掉,下次go build可能拉错远程版本 - 校验状态错乱:
.info文件和go.sum中的 checksum 应当严格对应,手动删部分文件后,剩余的.info可能指向已不存在的 zip,触发后续go mod verify失败 - 私有代理缓存污染:若你用 Nexus/JFrog 做 GOPROXY,
cache/download里可能混着同版本不同来源的包(比如一个来自 proxy.golang.org,一个来自内网代理),手动删只删目录不清理索引,下次go get可能随机命中脏数据
真正需要精准控制时,应先用 go mod graph | awk '{print $1}' | sort -u 提取当前项目实际引用的模块,再比对 cache/download/ 下的域名目录,只删未使用的私有域缓存。
清理前必须确认的三件事
执行 go clean -modcache 前,跳过这三项检查,大概率引发后续问题:
- 确认
go env GOPROXY和GOPRIVATE设置正确:尤其私有模块,若GOPRIVATE漏配,清理后go get会 fallback 到 public proxy 并因校验失败中断 - 备份当前项目的
go.sum:它记录了每个模块的精确 checksum,是恢复可信缓存的唯一依据;go.mod可以重生成,go.sum一旦丢,就得重新跑go mod verify并人工核对 - 检查磁盘是否真的被
GOMODCACHE占满:用du -sh $(go env GOMODCACHE),而不是du -sh $GOPATH/pkg—— 后者包含pkg/mod、pkg/obj、pkg/tool等多个子目录,误判会导致清错地方
缓存机制本身很稳定,出问题的从来不是缓存,而是人绕过工具链直接操作文件系统。只要坚持用 go clean -modcache,配合 go env 查路径、go mod verify 校验,就几乎不会踩坑。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











