【青训营】Go的依赖管理

Go的依赖管理

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

1.什么是依赖

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

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

2.GOPATH

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

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

pkg:项目编译的中间文件

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

下图我们可以看到GOPATH中的src,pkg和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为MAJOR,3为MINOR,0为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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值