这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
《Go语言进阶与依赖管理》学习笔记与总结
Go 依赖管理
Go 是一门年轻的语言,它的技术迭代和版本更新的速度相较于 C++、Java 这些成熟的语言更快,因此就会出现一种尴尬的情况,一些资料可能在它完成的时候就已经过时了。阅读不同"时代"资料,会给初学者带来很大的困扰。Go 的依赖管理经历了三个阶段,因此有必要了解一下它过去式,搜索资料的时候就可以选择性的阅读,避免浪费时间。
GOPATH
$GOPATH 是 Go 语言依赖的一个环境变量,可以通过以下命令查看,默认路径是 Home 目录下的 go 文件夹。
$ go env GOPATH
/Users/godzilla/go
$GOPATH 下有 3 个子文件夹,分别是:
bin——项目编译的二进制文件pkg——项目编译的中间产物src——加速编译项目源码
项目代码直接依赖 src 下的代码,并以绝对路径的方式导入,因此如果要使用第三方的依赖,需要使用 go get xxx 命令下载最新的依赖(源代码)到 src 目录。
弊端:无法实现依赖的版本控制。
假设项目 A 需要依赖 Pkg C 的 1.0 版本,项目 B 需要依赖 Pkg C 的 2.0 版本,由于项目实际依赖的是为于 src 目录下 Pkg C 的源代码,因此无法同时存在两个版本的 Pkg C。如果 Pkg C 的两个版本不兼容,则项目 A 和项目 B 无法同时构建成功。
Go Vendor
Go Vendor 方式是在项目的根目录下增加 vendor 文件夹,所有依赖包以副本形式放在 vendor 文件夹下,依赖寻址时会先查找 vendor 下的依赖,若找不到,则进入 $GOPATH 中查找。如此就解决了不同项目需要一个 Pkg 不同版本的冲突问题。
弊端:无法控制依赖的版本,同样会出现依赖冲突的问题。
假设项目 A 需要依赖 Pkg B 和 Pkg C,而 Pkg B 和 Pkg C 又分别依赖的 Pkg D 的 1.0 和 2.0 版本,如果这两个版本不兼容,项目同样无法构建成功。
Go Module
Go Module 定义了版本规则,使用 go.mod 文件管理依赖包版本,并通过 go get/go mod 指令工具管理依赖包。依赖的源代码并不会存放在 src 或 vendor 目录下,而是缓存到 $GOPATH/pkg/mod 路径下,并以版本号进行区分,在构建时将使用所需的版本,因此就不会产生依赖冲突。