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 里出现多条版本记录属正常——它按版本累积记录,不要手动精简。