### 为什么需要依赖管理
+ 最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面。这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?
### go module
go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。
### GO111MODULE
要启用go module支持首先要设置环境变量GO111MODULE,通过它可以开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是auto。
+ GO111MODULE=off禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。
+ GO111MODULE=on启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。
+ GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。
简单来说,设置GO111MODULE=on之后就可以使用go module了,以后就没有必要在GOPATH中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。
使用 go module 管理依赖后会在项目根目录下生成两个文件go.mod和go.sum。
### GOPROXY
Go1.11之后设置GOPROXY命令为:
```
export GOPROXY=https://goproxy.cn
```
Go1.13之后GOPROXY默认值为 https://proxy.golang.org ,在国内是无法访问的,所以十分建议大家设置GOPROXY,这里我推荐使用goproxy.cn。
```
go env -w GOPROXY=https://goproxy.cn,direct
```
### go mod命令
常用的go mod命令如下:
```
go mod download 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit 编辑go.mod文件
go mod graph 打印模块依赖图
go mod init 初始化当前文件夹, 创建go.mod文件
go mod tidy 增加缺少的module,删除无用的module
go mod vendor 将依赖复制到vendor下
go mod verify 校验依赖
go mod why 解释为什么需要依赖
```
### go get
在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。
+ 运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
+ 运行go get -u=patch将会升级到最新的修订版本
+ 运行go get package@version将会升级到指定的版本号version
如果下载所有依赖可以使用go mod download命令。
### 简单粗暴的使用go module
1.set GO111MODULE=on
2.SET GOPROXY=https://goproxy.cn (这是win环境下的) export GOPROXY=https://goproxy.cn (这是mac环境下的)
3.go mod init [包名] // 初始化项目(如果你是初始化项目直接 `go mod init` 就好了)
4.在你的目录文件下会生成go.mod和go.sum文件 go.mod 里面包含了你的所有的包!
5.在文件里面引入包名的时候有的编辑器会报错但是是可以正常编译的
6.下载包使用go get
7.修改包的版本号直接去go.mod文件修改然后go mod download