首页/开发/CI/CD 与发布速查/go.sum 校验和机制
构建与制品管理58 条

go.sum 校验和机制

go.sum 记录模块内容的哈希:下载内容与记录不一致时构建失败,抵御依赖内容被替换。

CI/CD 与发布速查开发更新于 2026-10-13

go.sum 是什么

go.sum 记录每个依赖模块内容的哈希:模块路径、版本加两种哈希(模块包与 go.mod 各一)。下载内容与记录不一致时构建失败,用来抵御依赖内容被偷偷替换——这是内容校验而不是版本锁定。它与校验数据库(如 sum.golang.org)的透明日志配合,构成 Go 模块供应链的校验层。留意分工:版本选择由 go.mod 负责,go.sum 只背书内容哈希,两者缺一不可。

基本信息

内容模块路径、版本与两种哈希(模块包与 go.mod)
校验go mod verify 检查已下载模块与记录一致
维护go.sum 随依赖变更更新并入库评审
环境变量GOSUMDB 校验数据库、GONOSUMDB 跳过前缀、GOPRIVATE 私有模块
代理GOPROXY 只影响下载路径,不改变哈希校验

典型使用场景

  • 校验本地模块缓存完整:go mod verify 定期跑
  • CI 完整性检查:构建前先 verify 再编译
  • 依赖变更评审:go.sum 的 diff 随 PR 一起评审
  • 私有模块:用 GOPRIVATE 跳过校验数据库但保留版本管理
  • 换代理后排查:确认校验行为未被环境变量改动
  • 更换模块来源:迁移镜像或 fork 后哈希记录会不同,差异要在评审中看清

校验命令

校验命令
go mod verify          # 校验已下载模块与 go.sum 一致
go mod tidy            # 整理依赖并更新 go.sum(变更需评审)
go mod download        # 预下载模块到本地缓存
# CI 中把 go.sum 变更当作依赖变更,纳入 PR 评审

相关环境变量

变量作用注意
GOSUMDB校验数据库地址改 off 等于关闭校验,需评审
GONOSUMDB豁免校验数据库的模块前缀私有模块常用
GOPRIVATE同时跳过代理与校验数据库比逐项配置更省事
GOFLAGS附加构建参数-mod=mod 在 CI 里慎用
校验数据库(sum.golang.org 等)提供第三方透明日志,GONOSUMDB/GOSUMDB 可调整该机制。
go.sum 属于仓库内容:别加进忽略名单,删掉等于放弃内容校验。
同一个模块在 go.sum 里出现多条版本记录属正常——它按版本累积记录,不要手动精简。

易错点

  • 冲突时随手删 go.sum:等于放弃内容校验,先弄清来源差异
  • 为图方便关闭校验:供应链风险敞开,校验相关环境变量的改动要评审
  • go.sum 未入库或未评审:缺少变更记录,依赖替换无从发现
  • 缓存中残留损坏模块:verify 报错先清模块缓存再重下,不要直接改 go.sum
  • 手动编辑 go.sum 改版本:哈希对不上直接失败,变更依赖用 go get 或 go mod tidy

数据来源与参考

  • Go Modules Reference
  • Go 官方文档《Module authentication》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌