这是我参与「第五届青训营 」伴学笔记创作活动的第 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拉取我们的代码并进行缓存,再进行分发。