Go Module
Go在版本1.11之前有其他的一些依赖管理工具,如:
- govendor
- dep
- godep
- golide
这些依赖管理工具查找依赖都是基于GOPATH,GOROOT或者vendor目录,并且项目代码也只能在GOPATH/src目录下面,为了解决强依赖于GOPATH的问题,Go开发了新的依赖管理工具:Go Module
Go Module解决依赖管理问题
Go module是从go-1.11推出的依赖管理项目,在v-1.11版本的时候Go mod还只是可选的,通过如下方式启用或禁用:
- 设置环境变量:GO111MODULE = off,项目会禁用go module功能,默认还是会用其他的工具管理依赖
- 设置环境变量:GO111MODULE = on,项目会启用go module功能,查找依赖会从当前模块的go module下查找,如果查找失败,也不会去到GOPATH或者vendor中查找依赖了
- 设置环境变量:GO111MODULE = auto,这是默认值。这表示如果项目下存在go.mod文件并且项目不在GOPATH/src目录下,那么就会使用go module功能,否则就会禁用go module功能
注:用go module管理的项目不能在GOPATH目录下,否则就会使用其他项目中已有的包管理工具管理依赖
Go Module的使用
go init
mkdir go_pro && cd go_pro
go mod init go_pro
完成上述操作之后,就会在当前目录下生成一个go.mod文件,这个文件中的结构如下:
//module 后面是当前项目的模块名称,一般与项目名称相同,但也可以不同
//例如:如果你想将你的项目push到github上,让别人通过go get的方式引用,那么此处可以用如下:
//module github.com/YouRepoName
module go_pro
//预设的go版本
go 1.13
//用于将一个模块版本替换成另一个模块版本,前提是当前模块为主模块时,例如:
replace k8s.io/api => k8s.io/api v0.0.0-20190918155943-95b840bb6a1f
//也可以用于引入本地的其他模块到当前这个模块中,例如:
replace ecm-sdk-go => ./vendor/go-util
//当前项目中的依赖列表
require (
github.com/go-git/go-git/v5 v5.1.0
)
//当前项目中禁止依赖包列表
exclude (
github.com/go-git/go-git/v5 v5.1.0
)
go module命令
-
go mod tidy
:添加丢失的依赖,删除不用的依赖 -
go mod download
:下载go.mod中的依赖到本地缓存,目前所有模块版本数据均缓存在$GOPATH/pkg/mod
和$GOPATH/pkg/sum
下,也可以指定cache位置 -
go mod graph
:显示模块依赖图 -
go mod vendor
:复制依赖到vendor目录下 -
go mod verify
:根据go.sum文件校验依赖 -
go mod why
:解释为什么要依赖 -
go list m -json all
:依赖详情 -
go list m -versions github.com/gin-gonic/gin
:查看gin所有的历史版本 -
go mod edit -require="github.com/gin-gonic/gin@v1.3.0
:更换依赖版本,执行完之后要执行:go mod tidy
,也可以直接改go.mod文件 -
go clean -modcache
:清理所有已经缓存的模块版本数据
go get命令
-
go get packageName
:安装依赖 -
go get -u
packageName:将依赖升级到最新的次要版本或修订版本 -
go get -u=patch packageName
:将依赖升级到最新的修订版本 -
go get package@version
:升级到指定的版本