1. 概述
- go的依赖管理的演进:GOPATH-->go vendor-->go module
- GOPATH
- 特点:依赖的第三方库源码只能放在GOPATH的src下才能正确导入需要的包,go get方式下载的依赖也是直接下载到src目录下。
- 带来的问题:当两个项目依赖同一个package的不同版本,由于package源码都是在src目录下,且go get时无法指定版本,导入包的时候也不能指定具体的版本。即无法做多版本的管理。
- go vendor
- 特点:在项目目录下会存在一个vendor文件夹。用来缓存一份项目的依赖,也就是说项目的包在vendor中有一份,在GOPATH/src中也有一份。项目会先去vendor中找,然后再去vendor中找。
- 解决的问题:这样就能在vendor中存在一个当前项目需要的某个版本的依赖了,不用再出现和其他项目因为依赖的项目版本不同而在src下会出问题了。解决了多版本依赖的问题。
- go module
- go1.11开始引入
- 可以通过设置环境变量中的
GO111MODULE值为on来开启,off来关闭。
- 特点:在项目目录下会有一个go.mod文件。如果没有可以通过命令生成。
- goproxy代理
- 作用:存放依赖包的代理站点。如果设置了goproxy站点,会先从设置的站点上去获取所需要的依赖,当所有的代理站点都获取不到时,才会从源站上下载。
- 比如获取github上的代码失败,可以设置阿里云的代理,从国内代理站点中下载会更快更稳定。
- go get/go mod命令工具
2. GOPATH
- 在GOPATH模式下,go get下载的依赖会放在
$GOPATH/src下。我们自己编写的项目代码也是放在$GOPATH/src目录下。
- GOPATH目录结构:
- bin 存放编译后的二进制文件
- pkg 存放编译后的库文件
- src 存放项目代码
3. go module
- go1.11之后,项目默认会使用go module来管理项目依赖,即环境变量中的
GO111MODULE默认为 on开启状态,改为off则为关闭状态。
- 查看go环境变量的命令:
go env
- 修改环境变量:
go env -w GO111MODULE=on

- 项目目录下会默认有一个go.mod文件和go.sum文件。如果没有可以通过以下命令生成:
go mod init
3.1 go.mod文件格式
- go依赖的标识方式:
[模块path] [版本]
// indirect的含义:表示这个依赖是被项目间接依赖的。比如A-->B-->C,A和B是直接依赖,A和C是间接依赖。
+incompatible后缀的含义:
- 在go module模式的规定中,如果模块的主版本>2了,比如v2.x.x了,就得在模块path后面标识vx,比如
example/lib5/v3 v3.0.2。
- 但会有些早期的依赖库,还没有使用go module模式进行依赖管理,没有go.mod文件,且主版本号已经>2了,此时模块path后面就没有标识vx。所以就会在版本后面添加
+incompatible标识出来。
- 版本标识的两种形式:
- vx.x.x:`v[主版本].[功能版本].[bug、漏洞修复版本]
- vx.0.0-yyyymmddhhmmss-abcdefd12343:基于commit提交标识的伪版本标识

- go.sum文件

3.2 goproxy代理
- 作用:存放依赖包的代理站点。如果设置了goproxy站点,会先从设置的站点上去获取所需要的依赖,当所有的代理站点都获取不到时,才会从源站上下载。
- 比如获取github上的代码失败,可以设置阿里云的代理,从国内代理站点中下载会更快更稳定。
- 常用的一些代理:
- 阿里云:
https://mirrors.aliyun.com/goproxy/
- 七牛云:
https://goproxy.cn,direct
GOPROXY=https://goproxy.cn,direct
go env -w GOPROXY="https://goproxy.cn,direct"
4. 常用的go get/go mod命令
- 获取依赖:
go get example.org/pkg默认获取最新版本的依赖包
go get example.org/pkg@update获取最新版本(默认)
go get example.org/pkg@none删除依赖
go get example.org/pkg@v1.1.2获取指定版本
go get example.org/pkg@23dfdd5获取指定的commit版本
go get example.org/pkg@master获取mater分支最新的commit
- go mod
go mod init初始化,创建go.mod文件
go mod download下载模块到本地缓存
go mod tidy增加需要的依赖,删除没用到的依赖