Go构建模式
1.Go构建模式的演化
1.1 什么是Go的构建模式
Go程序的构建过程就是确定包版本,编译包以及将编译后得到的目标文件链接在一起的过程
1.2 GOPATH的构建模式
1.GOPATH构建模式的构建过程
在GOPATH构建模式下,Go编译的时候,会在GOPATH的环境变量目录下寻找依赖的第三方包,如果找到了,就使用这个第三方包进行编译,没找到,就会报编译错误
如果在本地没有找到第三方包,可以使用go get命令,将第三方包以及第三方包的依赖包下载到本地
在Mac或Linux上,GPOPATH的默认环境变量目录是 $HOME/go
2.GOPATH构建模式的缺点
go get获取到的时候当前时刻,第三方包的依赖版本,随着时间的演进,第三方包也会更新版本,这样就会导致不同时期获取到的第三方包版本不一样
因为go get获取的是最新版本,因此当第三方包的最新版本有bug,也会一直影响程序构建
在GOPATH构建模式下,Go编译器没有关注第三方依赖包的版本
1.3 vendor机制
1.什么是vendor机制
在项目的vendor目录下,将项目所依赖的第三方包缓存起来
2.vendor机制解决了什么问题
只要有vendor目录,Go程序会优先使用vendor下缓存的第三方包,不会优先使用GOPATH环境变量目录下的第三方包,因此提交代码的时候,如果将vendor目录一并提交,那其他开发者拉取代码之后,就可以直接进行构建
3.开启vendor机制的必要条件
Go项目必须位于GOPATH环境变量配置的某个路径的src目录下面
4.vendor机制的缺点
Go项目必须位于GOPATH环境变量配置的某个路径的src目录下面
vendor目录必须提交到代码仓库,减慢了代码的提交和下载速度
开发者需要手工管理依赖包,包括依赖包的分析、版本记录、依赖包的获取等
1.4 Go Module
1.什么是Go Module
Go module是一些Go包的集合,这些包和 module 一起打版本、发布和分发。
通常一个代码仓库对应一个Go module
2.go.mod文件
go.mod文件放置在Go Module的顶层目录下
一个Go Module和一个go.mod文件一一对应,也就是说,一个Go Module只会存在一个go.mod文件
3.如何创建一个Go Module
第一步,通过 go mod init 创建 go.mod 文件,将当前项目变为一个 Go Module
注意:在构建module时, go mod init $modulePath, 这个modulePath怎么写
modulePath的作用:
a.定位仓库的地址。如果代码开源到公共托管站点或者公司内部的代码仓库,那modulePath就要带上仓库的地址,这样其他依赖这个module才可以找得到
b.如果module不在根目录下,就是一个项目中可能有多个module,不在根目录下的module,modulePath中需要带上子目录路径
c.major版本号。如果major>=2,需要在module path中加上major号后缀
第二步,通过 go mod tidy 命令下载依赖并自动更新当前go.mod文件
go mod tidy 下载的依赖 module 会被放置在本地的 module 缓存路径下,默认值为 $GOPATH[0]/pkg/mod,Go 1.15 及以后版本可以通过 GOMODCACHE 环境变量,自定义本地 module 的缓存路径
第三步,执行 go build,执行新 module 的构建
go build 命令会读取 go.mod 中的依赖及版本信息,并在本地 module 缓存路径下找到对应版本的依赖 module,执行编译和链接