清理未使用的Golang模块依赖_go mod tidy命令实践

4次阅读

go mod tidy 只删除完全未被 import 的模块,保留间接引用、//go:embed、//go:build 等隐式依赖;需用 go mod graph 分析真实依赖,-v 参数同步 vendor,goproxy/goprivate 配置影响速度,checksum mismatch 应先验证再清理 go.sum。

清理未使用的Golang模块依赖_go mod tidy命令实践

go mod tidy 为什么没删掉某些模块

它只删「完全没被 import 的模块」,不是删「看起来没用的模块」。比如模块里某个 submodule 被间接引用(通过其他依赖的 go.mod 声明),或者项目里有未执行的 //go:embed//go:build 条件编译代码,go mod tidy 都会保留对应模块。

常见错误现象:go mod graph | grep xxx 发现某模块还在依赖图里,但自己代码里根本没写 import —— 很可能它是被某个依赖的 go.mod 显式 require 的,或被 replace 规则间接拉进来的。

  • 运行 go mod graph 查看实际依赖流向,比肉眼扫 go.sum 更可靠
  • 检查是否有 replaceexclude 影响了模块解析逻辑
  • 临时删掉 go.work(如果存在),避免工作区干扰单模块 tidy 行为

go mod tidy 后 vendor 目录没更新

默认情况下 go mod tidy 不碰 vendor/,它只同步 go.modgo.sum。要让 vendor/ 跟上变化,得加 -v 参数。

使用场景:CI 构建要求离线编译,或团队强制走 vendor 流程。这时候漏掉 -v 就会导致本地能跑、CI 报 cannot find package

立即学习go语言免费学习笔记(深入)”;

  • 执行 go mod tidy -v 才会重新填充 vendor/
  • go mod vendor 是等价命令,但 tidy -v 更安全——它先 tidy 再 vendor,避免 vendor 过时依赖
  • 注意 vendor/ 不会自动清理已删除模块的文件,得手动 rm -rf vendor/ && go mod tidy -v

go mod tidy 慢或卡住的几个原因

本质是它在拉取 module proxy 元数据、校验 checksum、甚至回退到 vcs fetch,网络或配置不对就会卡住。

性能影响明显的情况:模块多、proxy 不稳定、本地 GOPROXY 设置为 direct、或模块用了私有域名但没配 GOPRIVATE

  • 优先设 GOPROXY=https://proxy.golang.org,direct,国内可换 https://goproxy.cn
  • 私有模块必须加 GOPRIVATE=git.example.com/*,否则会尝试走 public proxy 导致超时
  • 临时提速:加 -x 看卡在哪一步,常是某个模块的 go list -m -json 请求 hang 住

go mod tidy 在 CI 中失败的典型错误信息

最常遇到的是 verifying github.com/xxx@v1.2.3: checksum mismatch,或 invalid version: unknown revision。这不是 tidy 本身的问题,而是 go.sum 和远程模块状态不一致。

根本原因是:有人手动改过 go.mod、或用 go get 覆盖了版本但没跑 tidy,又或者模块作者删了 tag。

  • 修复方法:删掉 go.sum,再跑 go mod tidy(谨慎!确保 go.mod 正确)
  • 更稳妥做法:go mod download 先拉全依赖,再 go mod verify 确认一致性
  • CI 中建议加 go mod graph | wc -l 做简单依赖规模检查,突增可能意味着意外引入

真正难处理的是跨 major 版本的隐式升级——比如 github.com/some/lib 从 v1 切到 v2,但没按规范用 /v2 路径,tidy 可能悄无声息换掉行为,这种得靠测试覆盖兜底。

text=ZqhQzanResources