Go的依赖管理
本节内容来自于:字节跳动青年训练营第五届 后端组
1.什么是依赖
实际开发的工程需要使用许多第三方库,这能够使得我们站在巨人的肩膀上,使用第三方库中封装好的函数,可以大大方便我们的程序开发,第三方库中广泛的功能,是标准库所不具备的,这些我们使用的库,又称为依赖。对于庞大的项目来说,是需要使用到许多库的,为了更好的管理库,我们需要使用依赖管理工具
Go的依赖库主要经过了三次迭代
主要目的:
1.根据不同环境不同项目使用不同依赖
2.控制依赖库的版本
2.GOPATH
GOPATH是Go的一个环境变量,其中GOPATH指向的路径有三个文件夹
bin:项目编译的二进制文件
pkg:项目编译的中间文件
src:项目依赖的库的存放位置
下图我们可以看到GOPATH中的src,pkg和bin三个文件夹
在src中可以看到许多我们之前使用过的包
在cmd 使用
go get 包名
会将最新的包下载到src中
GOPATH的问题在于无法实现package的多版本控制
3.GoVendor
- 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor的位置
不同的项目中的vendor的依赖包版本可以不同
vendor的问题在于:
如果一个Project需要依赖包A和B,而包A需要使用V1版本的依赖D,包B需要依赖于V2版本的依赖D,那么照样会引发冲突
4.GoModule
通过go.mod文件管理依赖包版本
通过go get/ go mod指令管理依赖包
该依赖管理在1.1版本实装,一般默认开启
依赖管理有三要素:
打开一个go.mod文件,可以看到其如下:
其中module std为依赖管理基本单元
go 1.19指明了go的原生库的版本号
require中的内容为单元依赖,表示了该单元需要依赖的包,后面的//indirect为表示该依赖是非直接依赖(间接依赖)
GoModule不同于GoPath和GoVendor,它是有版本管理的,其中有两种表示法:
// 语义化版本
${MAJOR}.${MINOR}.${PATCH}
//例子
V1.3.0 // 其中1为MAJOR,3为MINOR,0为PATCH
其中不同的MAJOR之间是代码隔离的,MINOR是一些新增功能的版本,PATCH是一些bug修补的迭代
版本x.0.0和语义化版本一样,yyyymmddhhmmss为时间,后面的为HASH校验码
5.依赖分发
依赖分发用于表示可以使用何种方式获取依赖,依赖可以从各种代码仓库中取得,但是有以下问题:1.无法保证构建稳定性 2.无法保证依赖可用性 3.增加代码仓库压力
为此,我们使用GoProxy,是一种中转代理服务站点,它会缓存各个托管仓库的代码内容,不会频繁使用代码仓库,也不会因为依赖被更改而无法确保构建的稳定性,从而实现了稳定可靠的依赖分发
GoProxy通过设置GOPROXY环境变量来表示,比如:
GOPROXY="https://proxy1.cn, https://proxy2.cn, direct
在上述例子中,Go获取依赖时会首先到https://proxy1.cn 获取,如果找不到则跳转到 https://proxy2.cn 如果还是找不到,那么就会前往源站(direct)中查找
6.go get命令
go get命令用于获取依赖,使用方法如下:
go mod命令