这是我参与「第三届青训营-后端场」笔记创作活动的的第5篇笔记
Go依赖管理
Go的依赖管理(包管理)大致分为三个阶段:
- Gopath
- Go Vendor
- Go Module
GOPATH 模式
GOPATH 目录是所有工程的公共依赖包目录,所有需要编译的 go 工程的依赖包都放在 GOPATH 目录下. 但这样不同的工程可能需要不同依赖包、不同版本的依赖包,若多个工程使用同一台机器编译,使用同一个 GOPATH 目录,将会使得 GOPATH 目录越来越臃肿,需要在编译工程时,将所有依赖包下载到 GOPATH 目录.
Vendor 模式
为了解决 GOPATH 模式下,多个工程需要共享 GOPATH 目录,无法适用于各个工程对于不同版本的依赖包的使用,不便于更新某个依赖包. go 1.6 之后开启了 vendor 目录. 每个工程可以将依赖包直接放到工程子目录 vendor 中,这样不同的工程可以存放自己需要的各种依赖包到 vendor 目录中,互不影响,当工程放到其它机器上进行开发、编译时,也不在需要在花时间下载所有需要的依赖了. vendor 目录解决了工程依赖打包的问题,可将依赖与工程一起打包,减少下载依赖的时间, 它同时被 "GOPATH 模式" 和 "Go Mod 模式" 支持.
Go Module 模式
vendor 目录下的依赖包还是需要手动加入,也没有依赖包的版本记录,那么 vendor 下的依赖包的进行升级更新也还是有困难,这些对于开发者来说都不是很友好. 并且也已经有社区针对性的做出了 go 的自动管理工具. 而 go 语言之外的其它编程也基本都已经有自动化的包管理工具了. 经过官方与社区的迭代,在 1.13 版本后,包管理工具 go mod正式被 go 官方并默认开启,成为官方的自动管理工具. go mod 解决了必须将工程放在 GOPATH 目录下的问题,可以在 go.mod 中配置工程的 module 名. 在 go.mod 文件中记录了不同版本依赖包的信息,支持自动下载指定的依赖包,可以自动扫描工程依赖的包信息加入 go.mod. 在 go get 依赖包后也会自动加入 go.mod ,同时 go mod 也兼容了 vendor 目录,可以使用 go mod vendor 命令自动将依赖包放在工程子目录的 vendor 目录下. go mod 对 vendor 目录的支持可以很方便的将老的 GOPATH 模式的工程转移到新的包管理工具 go mod 中(自动导入,兼容GOPATH, Vendor)