Go 构建模式

本文将介绍 Go 构建模式的演化。

一、Go 构建模式的演化

Go 的构建模式经历了三个迭代,分别是:最初的 GOPATH、1.5 版本的 Vendor 机制、如今的 Go Module。

二、GOPATH

GOPATH 在 Go 语言首次开源时就内置其中。

GOPATH 是一个环境变量,指向本地的工作目录,其文件组织方式如下:

  • go
    • bin:编译后的二进制文件
      • project1
      • project2
    • pkg:预编译文件,用于加快编译速度
    • src:源码
      • project1
      • project2

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:记录依赖的具体版本及哈希值

参考