go modules机制
go modules是golang在1.11版本中作为实验性功能加入,并在1.12版本中将go modules纳入正式支持。go modules是一个新型的go包管理工具,用于解决go程序的包依赖问题。
在go modules出现之前,go程序的第三方包依赖管理一直是个头疼的问题,曾经出现过的包管理工具有govendor、dep、glide、godep等,这些包管理工具都是基于GOPATH或者vendor目录,并不能很好的解决不同版本依赖问题。go modules是在GOPATH之外一套新的包管理方式。
模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
go.mod和go.sum
go modules的使用首先得创建go.mod文件,go.mod文件初始化命令如下:
#在项目根目录下执行
go mod init
go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件。
go.mod文件主要包括3部分,分别描述了当前项目的名称,使用的go版本号和依赖的第三方包,文件内容如下格式:
module helloworld
go 1.12
require (
github.com/labstack/echo v3.3.10+incompatible
github.com/labstack/gommon v0.2.8
github.com/mattn/go-colorable v0.1.1
github.com/mattn/go-isatty v0.0.7
github.com/valyala/fasttemplate v1.0.0
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a
)
go module安装package的原则是先拉最新的release tag,若无tag则拉最新的commit,详见Modules官方介绍。 go module会自动生成一个go.sum文件来记录所以的依赖内容,如下格式:
github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
github.com/labstack/gommon v0.2.8 h1:JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0=
github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
...
go module安装的package依赖文件并不是下载到$GOPATH中,而是$GOPATH/pkg/mod中,多个项目可以共享缓存的module。
go mod 命令
go mod可使用的命令如下:
命令 | 说明 |
---|---|
download | download modules to local cache(下载依赖包) |
edit | edit go.mod from tools or scripts(编辑go.mod) |
graph | print module requirement graph (打印模块依赖图) |
init | initialize new module in current directory(在当前目录初始化mod) |
tidy | add missing and remove unused modules(拉取缺少的模块,移除不用的模块) |
vendor | make vendored copy of dependencies(将依赖复制到vendor下) |
verify | verify dependencies have expected content (验证依赖是否正确) |
why | explain why packages or modules are needed(解释为什么需要依赖) |
go.mod文件提供了module, require、replace和exclude四个命令来描述项目的包依赖关系
命令 | 说明 |
---|---|
module | 语句指定包的名字(路径) |
require | 语句指定的依赖项模块 |
replace | 语句可以替换依赖项模块 |
exclude | 语句可以忽略依赖项模块 |