Go Module使用教程

Go从1.11版本开始内置包管理工具,直到1.14已经正式支持Go Mdoule。以最新版Go1.13为例,学习GO包管。

启用

配置环境变量GO111MODULE,默认是auto,如果目录中包含go.mod将使用go modules模式

1
export GO111MODULE=on

使用

显示命令行帮助

1
go mod

进入到项目目录初始化模块

1
go mod init {moudle-name}

这里需要注意,你的包名需要与被引入使用的包名一致否则无法匹配,Go将无法编译应用。例如:你将包放到了github.com/xx/package 如果这里指定了{moudle-name}package,那么别人引用此包,将报错无法继续。

1
go mod tidy

执行该条命令就开始自动下载安装第三方包了,同时如果有包不在使用,将会从go.mod中移除。执行go build 也会自动安装依赖,是不是很方便。

go.mod文件说明

示例

1
2
3
4
5
6
7
8
9
module github.com/micro/go-micro

go 1.13

require (
github.com/BurntSushi/toml v0.3.1
github.com/beevik/ntp v0.2.0
github.com/bitly/go-simplejson v0.5.0
)

很直观的就可以看的出来require就是引用的包格式是 “包名+版本”这的版本其实就是tag,如果没有tag就会拉取master分支,会是下面的形式

1
golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582

20191014212845是commit的提交时间,da9a3fd4c582就是此次的commit的哈希。使用go get时我们可以指定版本或者分支如

1
2
go get gitlab.com/xxx/xx@cheuk-go
go get gitlab.com/xxx/[email protected]

如果是手动写入go.mod需要将@替换成空格,这样就可以正常拉取。

包映射

除了require方式,我们还可以指定require的包使用本地指定的包

1
replace github.com/BurntSushi/toml v0.3.1 => ./toml

github.com/BurntSushi/toml现在引用了一个我们放在本地的一个目录toml

代理

现在Go第三方有提供了代理,目前有三个

设置环境变量GOPROXYdirect表示在出错的时候使用直连。

1
export GOPROXY=https://goproxy.cn,direct

私有包

我们开发不可能所有包来自github,大部分公司都自建了gitlab服务。需要进行以下两部操作

1
git config --global url."[email protected]:".insteadOf "http://gitlab.xxx.com/"

这里将http替换成ssh可以进行免密拉取包。如果我们设置了代理,我们配置GOPRIVATE让其不走代理

1
export GOPRIVATE=*.xxx.com