Commit c5f5e3ee authored by eternal-flame-AD's avatar eternal-flame-AD

add gomod post

parent 6d5241df
---
title: "What go mod tidy does"
date: 2019-02-10T21:54:11+08:00
author: eternal-flame-AD
layout: post
identifier: 2f225428b5c664c8cdbf941c86d96485
tags:
- Golang
categories:
- Golang
- 技术
signature: go mod tidy为我们做了什么?
---
以前一直对 go modules 到底是怎么生成 `go.mod``go.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。 所以它其实并不是一个锁文件。
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment