What go mod tidy does

eternal-flame-AD
Sun, Feb 10, 2019
Golang 
Golang 技术 
https://eternalflame.info/blog/2019/02/what-go-mod-tidy-does/
CC-BY-NC 4.0
Comments

go mod tidy为我们做了什么?

以前一直对 go modules 到底是怎么生成 go.modgo.sum 的有点云里雾里,只知道写完代码运行一下 go mod tidy ,go就会神奇的把你的 dependency 写到 go.mod 里,随着生成的还有一个 go.sum ,里面是各种依赖的 hash ,看起来很像 package-lock.json 。 那么, go mod tidy 到底做了什么呢?

首先, go mod tidy 会先扫描你项目里的依赖(其中包括了所有 build tag 的组合),然后把他们写进 go.mod 里。 这时候你的 go.mod 会是这样的:

require (
	example.com/example v1.0.0
	example.com/example2 v1.0.0
)

同时,go 也会把这些依赖的 hash 保持下来记录到 go.sum 里。

之后,go 会对每一个依赖做如下的操作:

  1. 把依赖里的 go.sum 内容复制到当前 go.sum
    • 这个的目的是保证依赖的依赖的 integrity 也能够被 verify
  2. 检查这个项目的 go.sum 是否完整,如果有没有包括的依赖那么就在自己的 go.mod 里加一句: require example.com/dependency-not-tracked v1.0.0 // indirect
    • 这就是 go.mod// indirect 条目的主要来源,目的是为了填补因为依赖 go.mod 的错误导致的某个依赖没有被 go.mod 管理到。

综上,运行完 go mod tidy 之后,项目的每个依赖要么会受到自身 go.mod 的 constraint ,要么会受到项目依赖的 go.mod 的 constraint ,由此 reproducible builds 就得以保证了。而关于 go.sum 的作用就像是一个大数据库,记录了在项目的 scope 里所有已知依赖的 hash。 所以它其实并不是一个锁文件。