【青训营】Go的依赖管理

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Go的依赖管理

本节内容来自于字节跳动青年训练营第五届 后端组

1.什么是依赖

实际开发的工程需要使用许多第三方库这能够使得我们站在巨人的肩膀上使用第三方库中封装好的函数可以大大方便我们的程序开发第三方库中广泛的功能是标准库所不具备的这些我们使用的库又称为依赖。对于庞大的项目来说是需要使用到许多库的为了更好的管理库我们需要使用依赖管理工具

Go的依赖库主要经过了三次迭代
image.png
主要目的
1.根据不同环境不同项目使用不同依赖
2.控制依赖库的版本

2.GOPATH

GOPATH是Go的一个环境变量其中GOPATH指向的路径有三个文件夹

bin:项目编译的二进制文件

pkg:项目编译的中间文件

src:项目依赖的库的存放位置

下图我们可以看到GOPATH中的srcpkg和bin三个文件夹
image.png

在src中可以看到许多我们之前使用过的包
image.png

在cmd 使用

go get 包名

会将最新的包下载到src中

GOPATH的问题在于无法实现package的多版本控制

image.png

3.GoVendor

  • 项目目录下增加vendor文件所有依赖包副本形式放在$ProjectRoot/vendor的位置

image.png
不同的项目中的vendor的依赖包版本可以不同

vendor的问题在于

image.png
如果一个Project需要依赖包A和B而包A需要使用V1版本的依赖D包B需要依赖于V2版本的依赖D那么照样会引发冲突

4.GoModule

通过go.mod文件管理依赖包版本
通过go get/ go mod指令管理依赖包
该依赖管理在1.1版本实装一般默认开启

依赖管理有三要素

image.png

打开一个go.mod文件可以看到其如下

image.png
其中module std为依赖管理基本单元

go 1.19指明了go的原生库的版本号

require中的内容为单元依赖表示了该单元需要依赖的包后面的//indirect为表示该依赖是非直接依赖间接依赖

GoModule不同于GoPath和GoVendor它是有版本管理的其中有两种表示法

// 语义化版本
${MAJOR}.${MINOR}.${PATCH}
//例子
V1.3.0 // 其中1为MAJOR3为MINOR0为PATCH

其中不同的MAJOR之间是代码隔离的MINOR是一些新增功能的版本PATCH是一些bug修补的迭代

image.png
版本x.0.0和语义化版本一样yyyymmddhhmmss为时间后面的为HASH校验码

5.依赖分发

依赖分发用于表示可以使用何种方式获取依赖依赖可以从各种代码仓库中取得但是有以下问题1.无法保证构建稳定性 2.无法保证依赖可用性 3.增加代码仓库压力

为此我们使用GoProxy是一种中转代理服务站点它会缓存各个托管仓库的代码内容不会频繁使用代码仓库也不会因为依赖被更改而无法确保构建的稳定性从而实现了稳定可靠的依赖分发

image.png

GoProxy通过设置GOPROXY环境变量来表示比如

GOPROXY="https://proxy1.cn, https://proxy2.cn, direct

在上述例子中Go获取依赖时会首先到https://proxy1.cn 获取如果找不到则跳转到 https://proxy2.cn 如果还是找不到那么就会前往源站(direct)中查找

6.go get命令

go get命令用于获取依赖使用方法如下

image.png

go mod命令

image.png

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go