Go Modules使用教程
引入
https://talks.godoc.org/github.com/myitcv/talks/2018-08-15-glug-modules/main.slide#1
Go Modules介绍
Modules是Go 1.11中新增的实验性功能,基于vgo演变而来,是一个新型的包管理工具。
常见的包管理工具
- govendor
- dep
- glide
- godep
这些包管理工具都是基于GOPATH
或者vendor
目录,并不能很好的解决不同版本依赖问题。Modules是在GOPATH
之外一套新的包管理方式。
如何激活Modules
首先要把go升级到1.11。
升级后,可以设置通过一个环境变量GO111MODULE
来激活modules:
- GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
- GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
- GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:当前目录在GOPATH/src之外且该目录包含go.mod文件,或者当前文件在包含go.mod文件的目录下面。
当module功能启用时,GOPATH
在项目构建过程中不再担当import的角色,但它仍然存储下载的依赖包,具体位置在$GOPATH/pkg/mod
。
初始化Modules
Go1.11新增了命令go mod
来支持Modules的使用。
1 | > go help mod |
首先创建一个项目helloworld:
1 | cd && mkdir helloworld && cd helloworld |
然后创建文件main.go
并写入:
1 | package main |
初始化mod:
1 | go mod init helloworld |
系统生成了一个go.mod
的文件:
1 | module helloworld |
然后执行go build,再次查看go.mod文件发现多了一些内容:
1 | module helloworld |
同时多了一个go.sum
的文件:
1 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
go.sum不是一个锁文件,是一个模块版本内容的校验值,用来验证当前缓存的模块。go.sum包含了直接依赖和间接依赖的包的信息,比go.mod要多一些。
go.mod
有四种指令:module,require,exclude,replace。
- module:模块名称
- require:依赖包列表以及版本
- exclude:禁止依赖包列表(仅在当前模块为主模块时生效)
- replace:替换依赖包列表 (仅在当前模块为主模块时生效)
其他命令
1 | go mod tidy //拉取缺少的模块,移除不用的模块。 |
1 | go list -m -json all //依赖详情 |