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,执行编译和链接