为什么需要依赖管理?
- 学会站在巨人的肩膀上
- 复杂工程项目不可能基于标准库0~1编码搭建
- 管理依赖库
Go依赖管理演进
GoPATH、GoVendor、GoMoudle
- 不同环境(项目)依赖的版本不同
- 控制依赖库的版本
GoPATH
- 环境变量
- 项目代码依赖src下的代码
- go get下载最新版本的包到src目录下 问题:无法实现package的多版本控制
GoVendor
- 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
- 依赖寻址方式: vendor => GOPATH
- 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。 问题:无法控制依赖的版本。更新项目又可能出现依赖冲突,导致编译出错。
GoMoudle
终极目标:定义版本规则和管理项目依赖关系
- 通过go.mod文件管理依赖包版本
- 通过go get/go mod指令工具管理依赖包
依赖管理三要素
配置文件,描述依赖 | go.mod |
中心仓库管理依赖库 | Proxy |
本地工具 | go get/mod |
go.mod
Go
复制代码
module example/project/app //依赖管理基本单元 go 1.16 //原生库 require ( //单元依赖 example/lib1 v1.0.2 example/lib2 v1.0.0 // indirect 间接依赖 example/lib3 v0.1.0-20190725025543-5a5fe074e612 example/lib4 v0.0.0-20180306012644-bacd9c7ef1dd // indirect 间接依赖 example/lib5/v3 v3.0.2 example/lib6 v3.2.0+incompatible )
依赖标识: [Module Path][Version/Pseudo-version]
incompatible
主版本2+模块会在模块路径增加/vN后缀。 对于没有go.mod 文件并且主版本2+的依赖,会+incompatible
version
语义化版本`MAJOR.{MAJOR}.MAJOR.{MINOR}.$ {PATCH}
V1.3.0
V2.3.0
基于commit伪版本vX.0.O-yyyymmddhhmmss-abcdefgh1234
v0.0.0-20220401081311-c38fb59326b7
v1.0.0-20201130134442-10cb98267c6c
依赖分发-Proxy
开发者直接通过Github或者SVN管理代码,有一定的缺点,不符合构建系统的初衷
- 无法保证构建稳定性 增加/修改/删除软件版本
- 无法保证依赖可用性 删除软件
- 增加第三方压力 代码托管平台负载问题
使用Proxy可以解决这些问题
Go Proxy是一个服务站点,它会缓源站中的软件内容,缓存的软件版本不会改变,并且在源站软件删除之后依然可用
变量 GOPROXY
Golang 学习笔记之GOPROXY - 知乎 (zhihu.com)
为什么要使用 go module proxy - 知乎 (zhihu.com)