一.理论概述
1. 依赖的概念
我们不可能所有的编码都要自己写,我们需要大量引用第三方的库,依赖它来进行编译。
2. 依赖管理的三个阶段GOPATH,GOVENDOR,go mod
a. GOPATH: GOPATH顾名思义,就是go的环境目录,有以下几个特点
- 默认在~/go(unix,linux),%USERUSERPROFILEUSERPROFILE%\go(windows) [用户目录下的go] ,它的管理方式是不管理,所有依赖都在gopath找,这样会导致一个问题:所有项目都放在这里,所有依赖的东西也放在这里,后面就会变得非常大
- 历史:Google将20亿行代码,9百万个文件放在一个repo里
- 在实际操作当中有个注意事项,就是需要在gopath底下创建一个src文件,并且把项目和依赖都放入里面
b. GOVENDOR
- 在gopath方式管理依赖的时候会出现一个问题,比如project1需要用到依赖的库A(1.0版本),project2需要用到的依赖的库也还是A,但是它需要2.0版本,这时候他们又放在同一个目录底下,那到底引用谁的呢?这时候出现了vendor,即在project1目录底下建立一个vendor,project2目录底下建立一个vendor,将各自引用的库放在里面即可。
- 这里要额外提一个知识点,就是go是如何寻找对应的库呢?它会先到go安装目录底下找对应找依赖库,再到gopath的src里找依赖库,如果加入了vendor会先在里面找。 vendor > gopath/src > go/src
- 这时候衍生了大量第三方依赖管理工具:glide,dep,有点类似php中的composer (个人感觉)
c. go mod
- Go Module是Go会在1.11中正式推出的包管理机制
- 由go 命令统一管理,用户无需关心目录结构
- 编译时是从GOPATH/pkg/mod下查找依赖
- 更新依赖:go get[@v], go mod tidy 清除旧的信息
- 初始化 go mod init
- 将旧项目移到go mod,1.先初始化 go mod init 2.go build ./...
- 增加依赖,可以直接go get / import 代码里面加(build的时候会自动加载依赖,但是可能暂时没有提示)