Go依赖管理

Go依赖管理

实际开发过程中,工程项目不可能都从0到1地开发。所以,依赖库的管理非常重要。

一、Go依赖管理的演进

  1. GOPATH
  2. Go Vender
  3. Go Module

主要解决两个问题:不同环境依赖的版本不同;控制依赖库的版本

1.GOPATH

GOPATH是一个环境变量,是Go的一个工作区。在go的早期版本里,需要将代码放在$GOPATH/src下,而且go get产生的依赖也会自动下载到$GOPATH/src

1
2
3
4
5
6
GOPATH
├── bin #项目编译的二进制文件
├── pkg #项目编译的中间产物,加速编译
├── src #项目源码
├── github.com
...

GOPATH呈现的特点是:

  • 项目代码直接依赖src下的代码
  • Go get下载最新版本的包到src目录下

GOPATH的弊端也很明显:就是当projectA依赖于某个包的v1版本,而projectB又依赖于该包的v2版本,就会出现问题——无法实现package的多版本控制

2.Go Vender

随着Go的依赖包越来越丰富,版本越来越多。Go 官方在 Go 1.5 的时候提出了实验性质的 vendor 机制——每个项目都可以有一个``vendor/``目录来存放项目所需版本依赖的拷贝

  • 在项目目录下,增加vendor文件夹,所有依赖包副本形式放在$ProjectRoot/vendor;
  • 依赖寻址方式:首先查找vendor,再查找GOPATH;
  • 通过每个项目引入一份依赖符本,解决了多个项目需要同一个package依赖的冲突问题

Go Vendor依然存在一些弊端——同一个项目中的package可能依赖于不同版本的包,这也会产生冲突

3.Go Module

  • 通过go.mod文件管理依赖包版本
  • 通过go get/go mod指令工具管理依赖包

Go Module实现了最终的目标:可以定义版本规则和管理项目依赖关系

二、依赖管理

1.依赖管理的三要素

  1. 配置文件,描述依赖 go.mod
  2. 中心仓库管理依赖库 Proxy
  3. 本地工具 go get/go mod

2.配置文件

go.mod结构如下, 其中version分为两种,语义化版本;基于commit的伪版本

go.mod文件中出现 +incompatible,说明你引用了一个不规范的 Module,正常情况下,只能说明这个 Module 版本未遵循版本化语义规范。可能会有一些风险

3.中心仓库管理依赖库

Go mod中的依赖都可以对应到github上的某一个提交的代码版本,这样就可以直接下载代码来完成依赖分发。但是过度依赖代码托管平台又会导致以下几个问题:

  • 无法保证构建稳定性:增加/修改/删除软件版本
  • 无法保证依赖可用性:代码的作者可以删除软件
  • 增加第三方压力:代码托管平台负载问题

所以我们可以在中间增加一个proxy,它负责缓存软件版本,保证了依赖的稳定性。

我们使用GOPROXY来管理proxy的配置:

1
2
3
4
5
GOPROXY="https://proxy1.cn, https://proxy2.cn, direct"

#服务站点URL列表,“direct”表示源站
#proxy1->proxy2->Direct
#即会先从proxy1查找依赖,再到proxy2查找依赖,最后回到源站查找

4.工具go get

go get命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装

1
go get example.org/pkg
1
2
3
4
5
@update  默认
@node 删除依赖
@v1.1.2 tag版本,语义版本
@23dfdd5 特定的commit
@master 分支的最新commit

5.工具go mod

go mod init

创建空项目后,可以执行这个命令。

1
2
go mod init gitee.com/biexiaoyansudian/my.cn
#指定了模块导入路径为 gitee.com/biexiaoyansudian/my.cn

这个 init 指定的路径作用是:

  • 作为模块的标识

  • 作为模块的import path,当其他项目引用这个模块下的 package 时都会以该 import path 作为共同的前缀import "``gitee.com/biexiaoyansudian/my.cn/mypkg``"

go mod init 执行完毕,就初始化了使用 Go modules 的项目,会多出来一个 go.mod 文件。它记录了当前项目的模块信息,每一行都以一个关键词开头。

go mod download

下载依赖包

go mod tidy

拉取缺少的依赖,移除不用的依赖

参考资料

[1] https://www.infoq.cn/article/xyjhjja87y7pvu1iwhz3

[2] 字节跳动青训营——Go语言上手 - 工程实践


Go依赖管理
https://wuhlan3.gitee.io/2022/05/09/Go依赖管理/
Author
Wuhlan3
Posted on
May 9, 2022
Licensed under