go clean -modcache 删除 $gomodcache 目录下所有解压的模块源码、.zip 包及校验文件(如 .info、.ziphash),但不触碰项目内的 go.mod、go.sum 或 vendor/;需确保 go111module=on 且无进程占用缓存文件,否则磁盘空间不会立即释放。

go clean -modcache 会删掉哪些文件
它清空的是 $GOMODCACHE 目录(默认为 $GOPATH/pkg/mod)里的全部内容:所有解压后的模块源码目录(如 github.com/sirupsen/logrus@v1.14.0)、对应的 .zip 包、校验数据(cache/download/ 下的 .info、.ziphash 等)。不会动你项目里的 go.mod、go.sum 或 vendor/ 目录。
执行前必须确认 GO111MODULE=on
go clean -modcache 在模块模式关闭时静默无效,不报错也不删除任何东西。运行前务必检查:
-
go env GO111MODULE输出应为on - 如果输出是
auto或off,先执行go env -w GO111MODULE=on - 若项目在
$GOPATH/src下且没go.mod,它根本不会生效
为什么磁盘空间没立刻变小
Linux/macOS 下,如果某个进程(比如 VS Code 的 Go 插件、后台 go build、CI 脚本里未退出的构建)正打开着 $GOMODCACHE 里的文件,go clean -modcache 删除的是文件句柄链接,实际磁盘空间要等进程释放句柄才回收。
验证是否真清了:lsof +D $(go env GOMODCACHE) | wc -l,输出为 0 才说明没进程在占用。常见干扰源包括:
- VS Code 的 Go language server(关掉编辑器再执行更稳妥)
- GoLand 的 indexing 进程
- 终端里挂着的
go run或go test -exec子进程
只想删某个模块,别全清
全量清理会强制重下所有依赖,耗时不可控,尤其在 CI 或带宽受限环境。更精准的做法是手动删指定模块:
- 删源码和校验数据:
rm -rf $(go env GOMODCACHE)/github.com/xxx@v1.2.3 - 删下载包:
rm -rf $(go env GOMODCACHE)/cache/download/github.com/xxx - 删完建议立刻跑
go mod verify,确保后续拉取的模块仍匹配go.sum
真正容易被忽略的是:清理后首次 go build 会触发完整重下载,而 go list -m all 显示的版本可能暂时滞后——得等 go mod download 完成才算真正“刷新”完毕。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











