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 命令获取依赖:
@v1.0.1 指定了版本,如果不指定则会自动寻找 v1 版本以下的最新版本。 同时,你也可以指定 @latest 来要求 golang 自动更新到最新版本。 你也可以换成指定的 commit_id:
- gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
- gopkg.in/vmihailenco/msgpack.v2 v2.9.1
- gopkg.in/yaml.v2 <=v2.2.1
- github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e
- go get github.com/pkg/xxx@latest
例如:
go get -u github.com/pkg/[email protected]
4.2.3. 自动拉取依赖
完成代码的编写后,执行 go build 或 go test 命令,相应工具会自动拉取依赖。
4.3. 依赖整理
在编写代码的过程中,往往会在 go.mod 文件中添加过多的依赖,golang 也提供了相应工具来整理依赖,增加丢失的依赖,删除无用依赖:
go mod tidy