go mod tidy 是 go 官方推荐的依赖同步工具,它严格基于项目中所有 .go 文件(含 _test.go)的实际 import 语句,对比并更新 go.mod 和 go.sum:自动添加缺失依赖、删除未被直接或间接引用的模块、标注 // indirect,但不处理缓存、源文件、vendor(除非加 -v)及运行时依赖。

go mod tidy 是什么,它到底干了什么
它不是“一键清理”,也不是“万能修复”,而是一个严格按导入图做同步的校验器。它只看 .go 文件里真实出现的 import 语句(包括 _test.go),然后对比 go.mod,该加的加、该删的删、该标 // indirect 的标。
常见误解是以为它会“智能判断业务逻辑是否还用得上某个包”——不会。只要代码里没 import,哪怕那个包被反射调用、被构建标签屏蔽、或只在 CI 脚本里用,go mod tidy 都会把它从 require 里移除。
- 新增 import?运行后自动加进
go.mod - 删掉 import?下次运行会提示
removing unused requirement并删掉对应行 - 依赖链变了(比如 A 升级后不再依赖 B)?B 若未被其他路径引用,也会被移除
-
go.sum总是跟着更新,但你绝不能手动改它
什么时候必须运行 go mod tidy
这四类场景不跑一次,go build 或 go test 很可能失败,或者 CI 构建结果和本地不一致:
- 刚
git clone一个 Go 项目,go.mod里缺一堆依赖 - 新增/删除了
import,比如引入github.com/sirupsen/logrus后忘了同步依赖 -
go build报错cannot find module providing package - 提交前想确认没有冗余依赖——尤其多人协作时,有人手改过
go.mod,容易残留
注意:它不解决网络问题。如果报 unknown revision 或 module not found,说明 Go 找不到那个模块源,不是 tidy 的责任,而是 replace、GO_PRIVATE 或模块本身缺失 go.mod 导致的。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
go mod tidy 不会碰哪些东西
很多人误以为它会“大扫除”,其实它非常克制,只动三样东西:go.mod、go.sum、以及依赖下载行为(仅限当前项目所需)。以下全是它明确不管的:
-
$GOPATH/pkg/mod缓存目录:旧版本模块还在,磁盘空间不会释放 - 项目里的
.go源文件(哪怕没被 import,也不会删) -
vendor/目录:默认完全无视,除非加-v参数且GO111MODULE=on+go mod vendor已启用 - 构建标签屏蔽的代码:比如
// +build !dev下的 import,tidy看不见,也就不会删掉对应依赖
想清缓存?得单独跑 go clean -modcache;想删无用源文件?那是 IDE 或人工的事。
跨模块或私有仓库下 go mod tidy 报错怎么办
报错如 unknown revision 或 no required module provides package,本质是 Go 工具链无法解析 import 路径指向的模块位置。这不是 tidy 的 bug,而是配置缺失:
- 私有 Git 仓库:必须设
GO_PRIVATE=git.example.com,否则 Go 默认走proxy.golang.org,认证失败或跳过域名 - 本地多模块开发:主模块 import 了
github.com/user/lib,但该 lib 还没推送到远程?得加replace github.com/user/lib => ./lib到主模块的go.mod - 子模块没
go.mod:比如import "github.com/user/repo/internal/util",但repo/internal/util目录下没go.mod,Go 会尝试从根模块找,失败就报错 -
replace写错路径:比如写成./local/lib但实际路径是../lib,tidy会静默失败,后续构建才暴露
验证是否生效,用 go list -m all | grep your-module 看实际解析出的路径,比猜更可靠。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










