【2】Go依赖管理 | 青训营笔记

91 阅读2分钟

这是我参与「第五届青训营」笔记创作活动的第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,增加需要的依赖,删除不需要的依赖,每次提交前可执行