Go依赖管理 | 青训营笔记

56 阅读1分钟

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

《Go语言进阶与依赖管理》学习笔记与总结

Go 依赖管理

Go 是一门年轻的语言,它的技术迭代和版本更新的速度相较于 C++、Java 这些成熟的语言更快,因此就会出现一种尴尬的情况,一些资料可能在它完成的时候就已经过时了。阅读不同"时代"资料,会给初学者带来很大的困扰。Go 的依赖管理经历了三个阶段,因此有必要了解一下它过去式,搜索资料的时候就可以选择性的阅读,避免浪费时间。

GOPATH

$GOPATH 是 Go 语言依赖的一个环境变量,可以通过以下命令查看,默认路径是 Home 目录下的 go 文件夹。

$ go env GOPATH

/Users/godzilla/go

$GOPATH 下有 3 个子文件夹,分别是:

  1. bin ——项目编译的二进制文件
  2. pkg ——项目编译的中间产物
  3. 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 指令工具管理依赖包。依赖的源代码并不会存放在 srcvendor 目录下,而是缓存到 $GOPATH/pkg/mod 路径下,并以版本号进行区分,在构建时将使用所需的版本,因此就不会产生依赖冲突。