依赖管理
01.Go依赖管理演进
GOPATH -> Go Vendor -> Go Module
02.GOPATH
就是我们平时熟知的环境变量,相当于Go语言的一个工作区,在这个工作区中有bin包,pkg包,src包。bin包里存的是项目编译的二进制文件,pkg包里存的是项目编译的中间产物,可以加速编译,src包中存的是项目源码,我们现在一般都是在src下编程。
把所有的项目代码都会放在src下,可以通过go get将最新版本的包下载到src目录下。
弊端:无法实现package的多版本控制。
03.Go Vendor
在项目目录下多了一个Vendor的包,将所有依赖的副本都放在里面,当用到依赖时会先从Vendor包中去寻找依赖,如果找不到的话再去GOPATH中去寻找。通过每个项目引入一份依赖副本,解决了多个项目需要同一个package依赖的冲突问题。
弊端:无法控制依赖的项目,我们再次更新项目可能又会出现版本冲突,导致编译错误。
04.Go Module
Go Module是官方推出的一款依赖管理工具,我们可以通过go.mod文件来管理依赖版本。一般是通过go get/go mod指令管理依赖包。它可以实现我们的终极目标:定义版本规则和管理项目依赖关系。
05.依赖管理三要素
Go里面的描述依赖的配置文件对应go.mod文件,中心仓库管理依赖库对应的是Proxy,本地工具对应的是go mod/get,这里我们可以将它与Java的Maven进行类比。
06.依赖配置-go.mod
如图,第一行是依赖管理基本单元,应该是引用的路径。第二行是go原生库的一个版本号。第三部分是单元依赖,主要是模块路径和版本号。
07.依赖配置-关键字indirect
举个例子,A依赖B,同时B依赖C,A->B->C,这时,A对B是直接依赖,A对C是间接依赖。在go.mod中,如果是间接依赖,需要我们在他的后面加上indirect关键字,来声明他是个间接依赖。
08.依赖配置-依赖图
答案应该是B,根据GO语言的依赖算法,他最后会选择一个能够兼容的最低版本。
09.依赖分发-Proxy
相当于依赖的一个中转站,各种依赖都发送到Proxy,然后我们再从Proxy去拉取依赖,有助于使拉取时的依赖版本更加对应,可以说Proxy使拉取依赖更加稳定可靠了。
10.依赖分发-GOPROXY
服务站点URL列表,direct表示源站,就是先从proxy1进行拉取,没有的话再去proxy2拉取,最后还没有的话就去第三方平台源站direct拉取。