这是我参与「第五届青训营」笔记创作活动的第2天。
依赖指各种开发包。开发项目时,要学会利用已经封装好的、经过验证的开发组件或工具,来提升自己的研发效率。
【1】Go依赖管理演进
目标:不同项目依赖的版本不同,控制依赖库的版本。
【1.1】GOPATH
GOPATH是Go语言的一个环境变量,该目录下的src目录存放项目源码。
弊端:同一个package,src下只能有一个版本存在,不同项目不能依赖同一个库的不同版本。
【1.2】Go Vendor
vendor是项目目录中的一个目录,存放依赖包副本。优先使用该目录中的依赖,不存在再从GOPATH中找。
弊端:更新项目可能出现问题,一个项目无法依赖同一个包的不同版本。
【1.3】Go Module
go.mod文件管理依赖包版本,go get / go mod 指令工具管理依赖包。
【2】依赖管理三要素
配置文件 描述依赖 go.mod
中心仓库 管理依赖库 Proxy
本地工具 go get/mod
【2.1】依赖配置 go.mod
module example/project/app
模块路径,例如github。
go 1.16
原生库版本。
require (
example/lib1 v1.0.2
example/lib2 v1.0.0 //indirect
example/lib3 v0.1.0-20190725025543-5a5fe074e612
example/lib5/v3 v3.0.2
example/lib6 v3.2.0+incompatible
)
单元依赖,模块路径+版本。
version
语义化版本,major.minor.patch,major表示不兼容,minor表示兼容的更新,patch表示修复bug。
基于commit伪版本,vx.0.0-yyyymmddhhmmss-abcdefgh1234,版本前缀和语义化版本相同,时间戳为提交的时间,校验码为12位的哈希前缀。
indirect
//indirect后缀,表示间接依赖,没有直接导入该模块。
incompatible
主版本≥2,路径加上/vN,视为不同模块,表示不兼容。
主版本≥2,路径没有加上/vN的,加上+incompatible后缀。
编译时选择最低的兼容版本。一个项目分别依赖某个包的v1.3和v1.4,编译时使用v1.4。
【2.2】依赖分发 Proxy
依赖分发,指的是从哪里下载、如何下载。
回源,直接从版本管理仓库下载,无法保证构建稳定性、依赖可用性,增加第三方压力。
Proxy是服务站点,会缓存源站的内容,保障稳定可靠。
GOPROXY
GOPROXY是一个环境变量,保存服务站点URL列表。
GOPROXY="https://1.cn,https://2.cn,direct"
依次寻找下载,最后的direct表示源站。
【2.3】工具 go get/mod
go get
go get example.org/pkg
@update,默认
@none,删除依赖
@v1.1.2,tag版本,语义版本
@23dfdd5,特定的commit
@master,分支的最新commit
go mod
go mod
init,初始化,创建go.mod文件
download,下载模块到本地缓存
tidy,增加需要的依赖,删除不需要的依赖,每次提交前可执行