什么是go.mod

从 2018 年 Go 1.11 开始,Go 官方推出了 Go Modules。为了保持向后兼容,Go 官方旧的依赖管理方式依然存在。启用 Go Modules 需要显示通过设置一个环境变量 GO111MODULE=on。在之后的 go 1.12 正式推出后,Go Modules 成为默认的依赖管理方式。

先前,我们的库都是以 package 来组织的,package 以一个文件或者多个文件实现单一的功能。一个项目包含一个package 或者多个 package。Go modules 就是一个统一打版和发布的 package 的集合,在项目根文件下有 go.mod 文件定义 module path 和依赖库的版本,还有一个 go.sum 的文件,该文件包含特定依赖包的版本内容的散列哈希值。

一般我们项目都是单 module 的形式,项目根目录下包含 go.mod 和 go.sum 文件,子文件夹定义 package,或者主文件夹也是一个 package。但是一个项目也可以包含多个 module,只不过这种方式不常用而已。

Module Path

go.mod 的第一行是 module path,一般采用“仓库+module name” 的方式定义。这样我们获取一个 module 的时候,就可以到它的仓库中去查询,或者让 go proxy 到仓库中去查询。

module github.com/dablelv/go-huge-util

如果你的版本已经 >=2.0.0,按照 Go 的规范,你应该加上 major 的后缀,module path 改成下面的方式:

module github.com/dablelv/go-huge-util/v2

module github.com/dablelv/go-huge-util/v3

而且引用代码的时候,也要加上v2、v3、vx后缀,以便和其它major版本进行区分。

这是一个建议性的约定,带来的好处是你一个项目中可以使用依赖库的不同的 major 版本,它们可以共存。

Go Directive

第二行是 go directive。格式是 go 1.xx,它并不是指你当前使用的 Go 版本,而是指名你的代码所需要的 Go 的最低版本。

go 1.17

因为 Go 的标准库在不断迭代,一些新的 API 会陆续被加进来。如果你的代码用到了这些新的 API,你可能需要指明它依赖的 Go 版本。

这一行不是必须的,可以不写。