Go的依赖管理 | 青训营笔记

93 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

无论是什么编程语言,都需要我们学会站在巨人的肩膀上进行开发。即使用第三方已经编写好的支持库,并依赖、进行引入。

使用依赖会极大的节省我们的开发时间,并且我们在今后的工作中,绝大多数的时候都需要依赖现成的框架,并在此基础上进行开发。

今天了解的就是GO的依赖管理,它的作用和用法与 Python的pip、Java的Maven、Gradle有异曲同工之处。

依赖管理演进

GOPATH > GO Vendor > Go Module

GOPATH

在环境变量$GOPATH中,存在以下3个文件夹

文件夹作用
bin项目编译的二进制文件
pkg编译的中间产物,加速编译
src项目源码

使用GOPATH进行依赖管理,将会直接依赖src下的代码。我们可以使用go get下载最新版本的包到src目录下。

但是它存在一个非常大弊端:A、B项目无法同时依赖同一个package的不同版本。

Go Vendor

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

查找依赖时按照顺序 vendor => GOPATH 进行查找。

它存在一个弊端,即无法控制依赖的版本,更新项目时可能出现依赖冲突,导致编译出错。

Go Module

有了前两种依赖管理方式的出现,Go Module也在后续被开发出来。它的终极目标就是定义版本规则和管理项目依赖的关系。这也是目前比较主流的管理依赖的方式。

它主要依靠项目目录下的go.mod文件依赖包管理。

也可以使用go get指令,来管理工具包

CD到项目目录,使用 go get gorm.io/gorm 即可自动下载gorm的最新版本依赖,并修改go.mod文件。

通常下载依赖会因为网络原因比较慢,我们可以使用go env -w GOPROXY=https://goproxy.cn,direct,优先使用镜像站点,快速下载依赖包。

go.mod

module example

go 1.19

require (
   example/lib1 v1.0.2
   example/lib2 v1.0.0  //indirect
   example/lib3 v0.1.0-20190725025543-5a5fe074e612
)

go.mod中最关键的依赖部分,在require中。require的每一个依赖,都要遵守格式: [路径] [版本]

其中版本不仅可以是语义化版本,即v1.0.2,还可以是基于commit的伪版本,即vX.0.0-yyyymmddhhmmss-commit。基于commit的伪版本会自动前往源仓库找到这个commit,并以这个commit的版本作为依赖。

此外在程序开发中,我们还要做好版本控制。目前比较主流的版本控制软件有Git、Svn。如果我们后续需要发布某个依赖包,就会需要使用这些工具,由Proxy拉取我们的代码并进行缓存,再进行分发。