1 介绍(go mod)
1.1、go mod是什么
go mod 是Golang 1.11 版本引入的官方包(package)依赖管理工具,用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理。
之前Golang 主要依靠vendor和GOPATH来管理依赖库,vendor相对主流,但现在官方更提倡go mod。
1.2、go mod初始化及使用
下载官方包1.11(及其以上版本将会自动支持gomod) 默认GO111MODULE=auto(auto是指如果在gopath下不启用mod)
Golang 提供一个环境变量 GO111MODULE 来设置是否使用mod,它有3个可选值,分别是off, on, auto(默认值),具体含义如下:
off: GOPATH mode,查找vendor和GOPATH目录
on: module-aware mode,使用 go module,忽略GOPATH目录
auto: 如果当前目录不在$GOPATH 并且 当前目录(或者父目录)下有go.mod文件,则使用 GO111MODULE, 否则仍旧使用 GOPATH mode。
修改 GO111MODULE 的值的语句是:set GO111MODULE=on 。
在使用模块的时候, GOPATH 是无意义的,不过它还是会把下载的依赖储存在 GOPATH/src/mod 中,也会把 go install 的结果放在 GOPATH/bin(如果 GOBIN 不存在的话)
go mod download 下载模块到本地缓存,缓存路径是 $GOPATH/pkg/mod/cache
go mod edit 是提供了命令版编辑 go.mod 的功能,例如 go mod edit -fmt go.mod 会格式化 go.mod
go mod graph 把模块之间的依赖图显示出来
go mod init 初始化模块(例如把原本dep管理的依赖关系转换过来)
go mod tidy 增加缺失的包,移除没用的包
go mod vendor 把依赖拷贝到 vendor/ 目录下
go mod verify 确认依赖关系
go mod why 解释为什么需要包和模块
注意有几个坑的地方:
go mod 命令在$GOPATH
里默认是执行不了的,因为 GO111MODULE 的默认值是 auto。默认在$GOPATH
里是不会执行, 如果一定要强制执行,就设置环境变量为 on。
go mod init 在没有接module名字的时候是执行不了的,会报错 go: cannot determine module path for source directory
。可以这样执行:
$ go mod init github.com/jiajunhuang/hello
否则就要在 main.go 里加上导入声明,例如:
$ cat main.go
package main
func main() {
println("Hello world")
}
$ go mod init
go: cannot determine module path for source directory /Users/jiajun/hello (outside GOPATH, no import comments)
$ vim go.mod
$ cat go.mod
module github.com/jiajunhuang/hello
$ go mod init
go mod init: go.mod already exists
$ rm go.mod
$ vim main.go
$ cat main.go
package main // import "github.com/jiajunhuang/hello"
func main() {
println("Hello world")
}
$ go mod init
go: creating new go.mod: module github.com/jiajunhuang/hello
$ ls
go.mod main.go
$ cat go.mod
module github.com/jiajunhuang/hello
当然,如果在已有代码的仓库里执行是不存在这个问题的。
2 命令
2.1 指定module的根目录并生成go.mod文件
go mod init example.com/hello
2.2 下载并添加依赖到go.mod文件中
go build, go test
2.3 查看module下的所有依赖
go list -m all
2.4 更新稳定版依赖
go get rsc.io/sampler
2.5 更新为指定版本依赖
go list -m -versions rsc.io/sampler
rsc.io/sampler v1.0.0 v1.2.0 v1.2.1 v1.3.0 v1.3.1 v1.99.99
go get rsc.io/sampler@v1.3.1
2.6 清理无用的依赖
go mod tidy
2.7 将依赖复制到项目路径的vendor文件夹中
go mod vendor
2.8 忽略cache里的包,只使用vendor目录里的依赖进行编译
go build -mod = vendor
2.9 校验依赖并查看是否有修改
go mod verify
原文链接:https://blog.csdn.net/zzhongcy/article/details/97243826
可参考文献:
- https://blog.csdn.net/Lazybones_3/article/details/89355133
- https://blog.csdn.net/kevinh531/article/details/88691870
- https://jiajunhuang.com/articles/2018_09_03-go_module.md.html
- https://blog.csdn.net/qq_33296108/article/details/88184060