## 如何使用 Modules?
1. 首先需要把 golang 升级到 1.11 版本以上(我使用的是go1.12.17版本)。
2. 设置 GO111MODULE。
#### GO111MODULE
在Go语言 1.12 版本之前,要启用 go module 工具首先要设置环境变量 GO111MODULE,不过在Go语言 1.13 及以后的版本则不再需要设置环境变量。通过 GO111MODULE 可以开启或关闭 go module 工具。
- GO111MODULE=off 禁用 go module,编译时会从 GOPATH 和 vendor 文件夹中查找包;
- GO111MODULE=on 启用 go module,编译时会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod下载依赖;
- GO111MODULE=auto(默认值),当项目在 GOPATH/src 目录之外,并且项目根目录有 go.mod 文件时,开启 go module。
Windows下开启GO111MODULE的命令为:
```c
set GO111MODULE=on 或者 set GO111MODULE=auto
```
MacOS或Linux下开启GO111MODULE的命令为:
```
export GO111MODULE=on 或者 export GO111MODULE=auto
```
在开启 GO111MODULE 之后就可以使用 go module 工具了,也就是说在以后的开发中就没有必要在 GOPATH 中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。
**常用的`go mod`命令如下表所示:**
| 命令 | 作用 |
| --------------- | ---------------------------------------------- |
| go mod download | 下载依赖包到本地(默认为 GOPATH/pkg/mod 目录) |
| go mod edit | 编辑 go.mod 文件 |
| go mod graph | 打印模块依赖图 |
| go mod init | 初始化当前文件夹,创建 go.mod 文件 |
| go mod tidy | 增加缺少的包,删除无用的包 |
| go mod vendor | 将依赖复制到 vendor 目录下 |
| go mod verify | 校验依赖 |
| go mod why | 解释为什么需要依赖 |
#### GOPROXY
proxy 顾名思义就是代理服务器的意思。大家都知道,国内的网络有防火墙的存在,这导致有些Go语言的第三方包我们无法直接通过`go get`命令获取。GOPROXY 是Go语言官方提供的一种通过中间代理商来为用户提供包下载服务的方式。要使用 GOPROXY 只需要设置环境变量 GOPROXY 即可。
目前公开的代理服务器的地址有:
- goproxy.io;
- goproxy.cn:(推荐)由国内的七牛云提供。
Windows 下设置 GOPROXY 的命令为:
```
go env -w GOPROXY=https://goproxy.cn,direct
```
MacOS 或 Linux 下设置 GOPROXY 的命令为:
```
export GOPROXY=https://goproxy.cn
```
Go语言在 1.13 版本之后 GOPROXY 默认值为 https://proxy.golang.org,在国内可能会存在下载慢或者无法访问的情况,所以十分建议大家将 GOPROXY 设置为国内的 goproxy.cn。
## 项目配置go mod
这里我使用的是Macos系统,首先执行下面命令,查看go mod功能是否开启
```
echo $GO111MODULE
```
如果值不是on建议运行`export GO111MODULE=on;`将go mod功能开启
1. 在使用go mod中,在项目中创建go.sum文件`go mod init`
2. 在终端运行`go mod tidy`将需要的包下载到本地的GOPATH/pkg/mod目录下
3. 对于有一些源在国外无法直接访问下载,有这些问题时`dial tcp 216.239.37.1:443: i/o timeout`,解决方法有如下两种
- 科学上网:执行以下命令,执行前**请将端口号替换为你自己的代理的端口号**
`export http_proxy=http://localhost:8889 `
`export https_proxy=http://localhost:8889`
- 使用国内的镜像源:
`export GOPROXY=https://goproxy.io`
`export GOPROXY=https://goproxy.cn` **推荐使用**
4. 然后你就可以直接go build的了(这里你也许并不会构建成功、别担心,看错误信息一般都是一些本地的包或者公司内部一些代码库无法使用go mod自动下载)
这里就需要使用到go mod的replace了。在go.mod文件中需要replace
```
replace (
source latest => target latest
)
//如下
replace (
zonst/logging v0.0.0 => ../../../logging
)
```
将你所有需要本地的包都replace。然后再次go build
对于本地的包的代码,如果没有使用go mod的话,就需要在终端执行以下命令
`export GO111MODULE=on`
`go mod init $projectName`
------
如果存在以下类似问题:
```
pkg/handlers/send_message.go:10:2: internal compiler error: conflicting package heights 20 and 10 for path "github.com/golang/protobuf/proto"
```
那么也是正常的,这是因为你下载依赖的包下载了最新的版本了出现的版本不兼容。这个时候你就需要到github.com中找到需要的包,以及找到需要使用的版本号或者是commit的ID还原到之前的版本。
```
reuire (
github.com/golang/protobuf v1.4.3
)
可以修改为
reuire (
github.com/golang/protobuf v1.3.3
)
```
5. 然后就大功告成了!