【青训营】Go的依赖管理

news/2025/1/16 2:55:49/

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


http://www.ppmy.cn/news/12855.html

相关文章

mysql 分库分表、 分区(partition)、sharding-sphere 综合整理

引言: 一般情况下,如果单表数据量超过2000w的样子查询速度会很慢,因为内存无法存储其索引,使得之后的 SQL 查询会产生磁盘 IO,从而导致性能下降。解决方案:mysql 分区 、 分表处理 分库分表: 原…

Python【r e】模块正则表达式[中]实战

正则表达式相关函数和符号用法:#正则表达式""".匹配任意某个字符[.]与转义字符的作用一致,表示匹配.,配合 ,[.],即匹配一次或则多次. text . 或则 text ...2.从头匹配或者从左往右匹配re.match()"""import …

Vuex模块化

store/index.js 【sumOptions、newsOptions分文件存放,并利用modules配置项将其模块化】import Vue from vue; import Vuex from vuex; import sumOptions from ./sum; import newsOptions from ./news; Vue.use(Vuex); export default new Vuex.Store({modules: {s…

【C++】二叉树进阶OJ题

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉根据二叉…

2022视频编码招聘面经

视频编码相关工作大概包括以下几个方向: 1. 视频编码标准,主要参与国际国内编码标准制定工作,招聘公司大多都是大厂,坑位较少 2. 软件编码器优化,主要是对codec内核的加速和性能提升,互联网公司需求较多 3.…

【网络安全】渗透测试之linux信息收集

前言 在内网中linux的服务器是占大多数的,主要原因分为以下几点 1.便宜,linux大多为免费的,Windows Server是收费的,对于企业来说为了节约成本,大量采用linux服务器。 2.轻便,linux主要是对服务器进行服务的…

Transformer学习笔记1

模型分类:GPT类型: auto-regressive(decoder模型,过去时刻的输出也是现在的输入,例如要得到y8还需要知道y1到y7,但不能使用y9,例如用于文本生成任务)GPTGPT2CTRLTransformer XLBERT类…

【科研试剂】16-Heptadecynoic acid,93813-16-2,16-庚二酸

【中文名称】16-庚二酸【英文名称】 16-Heptadecynoic acid,16-Heptadecynoic COOH【结 构 式】【CAS】93813-16-2【分子式】C17H30O2【分子量】266.43【纯度标准】95%【包装规格】1g,5g,10g【是否接受定制】可进行定制,定制时间周…