go module 的使用

1. 引言

从 GoLang 1.11 版本开始,官方推出了一个崭新的包管理工具 — go module,随着 GoLang 1.13 版本的发布,go module 默认开启,官方开始强推 go module,使用 go module 作为包管理工具已经成为了官方倡导的趋势。 本文,我们就来详细介绍一下 go module 的使用。

2. go module 的设计思想

2.1. 模块

go module 的设计思想是改变原有的基于仓库管理 golang 包的模式,而是通过更加灵活的“模块”来进行包管理,每个包含 go.mod 文件的目录都是一个模块,从而实现:

一个仓库包含一个或者多个模块

一个模块包含一个或多个包

一个包包含该目录下的所有 go 源码文件

2.2. go.mod

正如上面所说,go.mod 文件是 go module 模式的关键,他定义了模块的依赖关系。 go.mod 拥有四个指令 module, require, replace, exclude

  • module — 用来定义当前模块名称
  • require — 描述依赖信息
  • replace — 用于用指定依赖(后者)去代替前者,比如用 github 的仓库项目替代 goalng.org
  • exclude — 用来忽略某些特定版本

下面是一个 go.mod 的例子:

module github.com/hilaily/test
require (   // 引入需要的包
    github.com/gopkg/go-client v0.0.0-20170930090034-2628b1bfb590 // indirect
    github.com/gin/ginex v1.3.0 
    github.com/gopkg/consul v1.0.4 
)

replace ( // 指定包名替代路径
    github.com/test/a v0.0.0-20190603160528-e2879d2603b8 => github.com/test/a v0.0.0-20190704135338-bf0b0a45db46
    github.com/test/a v0.0.0-20190611023130-5ee11b162b30 => github.com/test/a v0.0.0-20190704135338-bf0b0a45db46
)

3. go module 的开启与配置

4.1. 开启 go module

通过设置环境变量 GO111MODULE=on可以打开gomodule,默认是auto,指的是如果项目不在GOPATH 下,则开启 go module。从 GoLang 1.13 开始,默认的 auto 意味着,只要当前目录具有 go.mod,那么无论项目在哪里,都开启 go module。

3.2. 相关环境变量

3.2.1. 代理

开启 go module 以后,通过 $GOPROXY 环境变量可以设置代理服务器,例如:

export GOPROXY=“https://goproxy.cn,direct”

3.2.2. 不使用代理的仓库

GOPRIVATE 与 GONOPROXY 两个环境变量是一样的, 他们定义了哪些仓库是不需要经过代理的,例如:

export GOPRIVATE=“*.corp.example.com,rsc.io/private

4. go module 的使用

4.1. 初始化

对于新项目或已有的非 go module 管理的项目,可以执行下面的命令来进行初始化:

go mod init

packagename 是模块的引入路径,例如 github.com/pkg/test 等。 初始化完成后,在当前目录会自动生成 go.mod 文件,里面只有一行文本:

module github.com/pkg/test

复制

4.2. 添加依赖

4.2.1. 手动添加

你可以参考上文,在 go.mod 中手动添加依赖的模块。 通过下面的命令,可以将 go.mod 中声明的包下载到本地:

go mod download

4.2.2. go get 获取

也可以通过执行 go get 命令获取依赖:

go get github.com/pkg/[email protected]

@v1.0.1 指定了版本,如果不指定则会自动寻找 v1 版本以下的最新版本。 同时,你也可以指定 @latest 来要求 golang 自动更新到最新版本。 你也可以换成指定的 commit_id:

例如:

go get -u github.com/pkg/[email protected]

4.2.3. 自动拉取依赖

完成代码的编写后,执行 go build 或 go test 命令,相应工具会自动拉取依赖。

4.3. 依赖整理

在编写代码的过程中,往往会在 go.mod 文件中添加过多的依赖,golang 也提供了相应工具来整理依赖,增加丢失的依赖,删除无用依赖:

go mod tidy