go mod tidy 不会删除未被直接引用的间接依赖,仅补全缺失模块并移除彻底无人使用的模块;需结合 go mod graph、go list 等命令人工排查真实依赖。
go mod tidy 不是“清理无用依赖”的万能命令,它只做两件事:补全缺失的模块、删除未被直接引用的模块——但不会删掉间接依赖(即 require 中标记为 // indirect 的项,除非它们彻底没人用了)。
为什么 go mod tidy 没删掉我明明没用的包?
常见误解是认为 go mod tidy 会像 npm prune 那样扫出所有“代码里没 import”的包。实际上它只看 import 语句和 go.sum 的一致性,不分析运行时或测试中是否真用到了某个符号。
- 如果某个包被
test文件 import(比如xxx_test.go),它会被保留在go.mod中 - 如果某个包被另一个已声明的依赖间接引入(哪怕你代码里完全没碰它),且该依赖没升级到剔除它的版本,
go mod tidy不会动它 -
// indirect标记只是说明“你没直接 import”,不代表它可删;只要仍有模块需要它,它就合法存在
如何真正识别并移除未使用的依赖?
得靠组合命令 + 人工验证,go mod tidy 只是其中一环: