Go 构建模式
本文将介绍 Go 构建模式的演化。
一、Go 构建模式的演化
Go 的构建模式经历了三个迭代,分别是:最初的 GOPATH、1.5 版本的 Vendor 机制、如今的 Go Module。
二、GOPATH
GOPATH 在 Go 语言首次开源时就内置其中。
GOPATH 是一个环境变量,指向本地的工作目录,其文件组织方式如下:
- go
- bin:编译后的二进制文件
- project1
- project2
- …
- pkg:预编译文件,用于加快编译速度
- src:源码
- project1
- project2
- …
- bin:编译后的二进制文件
Go 编译器会在 GOPATH 中搜寻依赖,如果存在则编译,不存在则报错。
go get
命令用于下载依赖。需要注意的是,go get
无法指定版本,它会下载当时的最新版本。
GOPATH 的缺点:
- 缺乏 对依赖版本的控制
三、Vendor
Go 在 1.5 版本中引入了 Vendor 机制。
在此机制下,
- 项目中会有一个 vendor 目录,项目的依赖会缓存到其中
- 编译时,Go 编译器会优先使用 vendor 下的依赖,当找不到时再去 GOPATH 中寻找
- 开发者可以将 vendor 目录和项目源码一起保存(一起提交到代码仓库中),从而保证项目的构建 “可重现”,而不会因为
go get
的版本问题导致构建异常
Vendor 的缺点是:
- 依赖的保存会 占用空间
- 要求开发者 手动管理 vendor 目录下的依赖
四、Go Module
在 Go Module 机制下,项目中会存在两个用于管理依赖的文件:
- go.mod:描述依赖
- go.sum:记录依赖的具体版本及哈希值