Go依赖管理 | 青训营笔记

101 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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添加需要的依赖,删除不需要的依赖