在go1.11版本以后go modules成为了go官方的依赖管理方式,替换一起的Godep。使用go modules管理依赖后会在当前的项目根目录下生成go.mod和go.sum.
-
go.mod
在其中记录当前的项目的所有依赖,文件格式如下:
module go-demos go 1.13 require github.com/x-mod/routine v1.2.7
或
module go-demos go 1.13 require ( github.com/x-mod/routine v1.2.7 ) replace ( // 针对有些被墙不能下载 可以替换成其他依赖包 golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0 )
-
go.sum
在其中记录每个依赖库的版本和哈希值,文件格式如下:
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
一.启用go modules
1.1 要求
(1)go版本 >= 1.11 (1.11才添加的)
(2)设置GO111MODULE环境变量设置:
GO111MODULE用来开启go module。其有三个值:off/on/auto; off关闭go module,on开启go moudle,而auto则会根据当前工程project目录下是否有go.mod文件来判断是否使用modules功能。需要指出的无论go module处于哪种模式下,module功能都不会在GOPATH指定目录下查找依赖文件,故而尽量设置代理GOPROXY变量来保证使用go module能够确保依赖下载到。
还有一点需要指出的,使用go module时,尽量手动设置GO111MODULE全局环境变量值为off,主要是为了兼容以前未使用go module项目引入go module。
echo export GO111MODULE=off >> ~/.bash_profile
或
直接在文件中手动设定
go mod命令:详情见go modules
download 下载依赖的module到本地cache
edit 编辑go.mod文件
graph 打印模块依赖图
init 在当前文件夹下初始化一个新的module, 创建go.mod文件
tidy 增加丢失的module,去掉未使用的module
vendor 将依赖复制到vendor下
verify 校验依赖
why 解释为什么需要依赖
二. 使用module
2.1 新建项目
$ export GO111MODULE=on
$ go mod init project目录(TestPro/github.com/XXX/TestPro)
......
$ go build //此时会将当前项目引用的依赖包括其依赖的依赖也会添加到go.mod中
2.2 已存在项目
$ export GO111MODULE=on
$ go mod init // 在当前project根目录下创建一个空的go.mod
$ go get 依赖 // 将当前项目中使用的依赖添加到go.mod中
需注意一点:go.mod是需要提交到代码仓库中的,而go.sum文件并不需要。
三. 打包
需要对前面已增加go module打包进行发布,此时要将当前项目需要的依赖下载到本地vendor目录。
### 指定打包生成的目标平台
export GO111MODULE="on" # 开启go module
export GOPROXY="https://mirrors.aliyun.com/goproxy/"#指定GOPROXY下载对应的依赖也可用replace替换
export CGO_ENABLED="0" # 使用cgo
export GOOS="linux" # 目标平台
export GOARCH=amd64 # 系统架构
go mod vendor # 依赖下载到vendor目录
go build # 构建
或
go build -ldflags "-s -w" -a -installsuffix cgo -o audit-webhook .
至此基本的go module已完成。
还有一些需要注意点:go module默认是不会在GOPATH下查找依赖文件的,其会在GOPATH/pkg/mod下,这样其他的module就可以使用已缓存在本地的依赖。
四. 引用
有疑问加站长微信联系(非本文作者)