引入Go mod的好处
- 自动下载依赖包
- 不需要将代码再放入$GOPATH/src
- 所有来自第三方的包都会指定版本(使用dep是无法指定第三方包的版本的)
- 对于已经转移的包,可以用replace在go.mod文件中替换,不需要修改代码
关于GO111MODULE环境变量说明
他有三个取值
- off:关闭,不使用gomod
- on: 打开,使用gomod
- auto: 对于以下两种case会使用gomod
(1)在$GOPATH/src之外 (2)当前文件在包含go.mod文件的目录下
go mod命令
| 命令 | 作用 |
|---|---|
| download | 下载依赖包 |
| edit | 编辑go.mod |
| init | 在当前目录下初试话gomod |
| tidy | 拉取缺少的模块,删除不用的模块 |
| vendor | 将依赖复制到vendor目录下 |
| verify | 验证是否正确 |
go.mod 命令字
| 命令字 | 作用 |
|---|---|
| module | 指定包的名字(路径) |
| require | 指定依赖项模块 |
| replace | 替换依赖项模块 |
| exclude | 忽略依赖项模块 |
使用
- 使用很简单,在go文件中import依赖的包名,然后go run xxx.go运行代码,go mod会自动查找依赖自动下载
- 可以使用命令go list -m -u all来检查升级的package,使用go get -u xxx_package@version来升级(version是x.y.z)
go.sum
这个是依据hash来检测下载下来的依赖,是不是和该版本依赖复合
项目升级
原先用vendor的可以在设置GO111MODULE之后切换到gomod模式,但需要注意,以前的本项目包的调用,使用的是对应的go文件相对于那个包的位置,切换到gomod之后,使用的是相对于go.mo的位置,所以有可能需要更新import 路径
关于版本
gomod要求目标库打上符合要求的tag,如果没有打上tag(x.y.z),就要求毫无差错的编写大串版本信息。基于以上原因,现在可以直接使用commit的hash来指定版本,如下:
# 使用go get时
go get github.com/mqu/go-notify@ef6f6f49
# 在go.mod中指定
module my-module
require (
// other packages
github.com/mqu/go-notify ef6f6f49
)
使用go build或者go mod tidy之后,go.mod会变成:
module my-module
require (
github.com/mattn/go-gtk v0.0.0-20181205025739-e9a6766929f6 // indirect
github.com/mqu/go-notify v0.0.0-20130719194048-ef6f6f49d093
)