go.sum 文件记录模块校验和而非锁定版本,真正锁定依赖的是 go.mod 的 require 语句与 go.sum 校验协同完成;其变更常见于首次构建、多版本引入、tag 重写、GOSUMDB 关闭等场景。
Go 的 go.sum 文件不是“锁文件”,它不锁定版本,而是记录模块下载时的校验和;真正锁定依赖版本的是 go.mod 中的 require 语句 + go.sum 的完整性校验协同完成的。
go.sum 会变,但 go.mod 没改?常见于以下场景:
go build 或 go test 时,Go 会自动填充 go.sum 中缺失的间接依赖(// indirect)校验和v1.2.0 和 v1.3.0 同时存在),Go 会为每个版本单独记录校验和go.sum 会拒绝旧校验和并报错 checksum mismatch
GOSUMDB=off 或替换了 sumdb,也会绕过校验逻辑,导致 go.sum 内容与公共 sumdb 不一致go mod tidy 会修改哪些文件?如何安全执行?go mod tidy 是同步依赖状态的核心命令,它会:
import 路径,补全缺失的 require 条目到 go.mod
import 引用的 require 行(包括 // indirect 标记的)go.sum:添加新模块校验和、删除不再需要的校验和条目go get),也不会降级建议在执行前确认:
go mod tidy -v 并检查退出码,失败即中断构建go:generate 工具),应在 go.mod 中显式 require 并加 // indirect 注释(Go 1.17+ 支持)checksum mismatch 怎么定位和修复?错误典型形式:
verifying github.com/sirupsen/logrus@v1.9.0: checksum mismatch downloaded: h1:...abc123... go.sum: h1:...def456...
原因通常是:
不可信的私有 proxy修复步骤:
go clean -modcache 清空本地模块缓存GOPROXY=direct go mod download 直连 origingo.sum 中记录的校验和与 sum.golang.org 查询结果是否一致replace 到可信 commit(写入 go.mod)go.sum 必须提交进 Git —— 它不是“生成文件”,而是依赖完整性的关键证据。遗漏会导致:
go.sum 不一致,CI 构建通过但本地构建失败go mod verify 时因缺少校验和而报错govulncheck)无法准确映射漏洞到实际使用的模块版本另外注意:
go mod vendor 会把模块源码复制进 vendor/,但 go.sum 仍需保留且必须与 vendor 内容一致;可用 go mod vendor -v 验证GOSUMDB=sum.golang.org,不建议关闭,除非明确使用私有 sumdbgo.sum:校验和格式敏感,出错会导致整个模块树校验失败