这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
Go依赖管理演进
GOPATH
GOPATH模式定义了一个环境变量$GOPATH,GOPATH下有三个文件夹bin,pkg,src
项目代码直接依赖src下的代码
用go get命令下载最新版本的包到src目录下
GOPATH模式的问题
无法实现包的多版本控制:A和B两个项目依赖同一个包的不同版本
Go Vendor模式
每个项目目录下增加vendor目录,所有依赖包以副本的形式放在vendor目录下。项目寻找依赖时,先在vendor目录中找,找不到再到GOPATH目录找。
解决了多个项目需要同一个包的不同版本的依赖冲突问题。
Go Vendor模式的问题
- 无法控制依赖的版本
- 更新项目又可能出现依赖冲突,导致编译出错
Go Module模式
- 通过
go.mod文件管理依赖包的版本 - 通过
go get / go mod指令工具管理依赖包
依赖管理的三要素
- 配置文件,描述依赖(go.mod)
- 中心仓库管理依赖库 (Proxy)
- 本地工具(go get/mod)
依赖配置
go.mod文件
module example/project/app
go 1.16
require(
example/lib1 v1.0.2
example/lib2 v1.0.1// indirect
example/lib3/v2 v2.0.1
example/lib4 v2.0.1+incompatible
)
版本号
语义化版本
${MAJOR}.${MINOR}.${PATCH}
如V1.3.0 V2.3.1
基于commit的伪版本
v1.0.0-20201120123332-10cb98267c1c
indirect
如果A依赖B,B依赖C,则A直接依赖B,A间接依赖C
incompatible
- 主版本2+的模块会在模块路径增加/vN后缀
- 对于没有go.mod文件并且主版本号2+的依赖,会+incompatible
选择最低的兼容版本
如果项目依赖了A,B两个项目,且A、B分别依赖了C项目的v1.3、v1.4两个版本,最终编译会使用C的v1.4版本。
依赖分发
GOPROXY
配置GOPROXY: go env -w GOPROXY=https://goproxy.cn,direct
工具
go get
go get example.org/pkg添加依赖example.org/pkg
@update默认
@none删除依赖
@v1.1.2指定tag版本
@23dfdd5指定commit版本
@master指定分支的最新commit
go mod
go mod init example.org/example: 初始化,创建go.mod文件
go mod download 下载模块到本地缓存
go mod tidy添加需要的依赖,删除不需要的依赖