依赖管理工具简介 · golang · 看云
### **GOPATH**
在早期的Go版本(<1.5)中,所有的依赖都是从GOPATH的src中进行检索。比如说,有如下的一个go文件,引用了包`example.com/hello`包中的SayHello函数
```
package main
import example.com/hello
func main() {
hello.SayHello()
}
```
那么,在构建这个文件时,Go命令会去到`$GOPATH/src/example.com/hello`目录下查找,查找该目录下的go文件中,是否有SayHello这个函数。
对于这种机制,有如下要求:
(1)当引用一个包时,被引用包的源码必须要先拷贝到`$GOPATH/src/`目录下
同时该机制也存在一定的缺点:
(1)被引用的包,必须手动拷贝到`$GOPATH/src`下
(2)被引用的包,没有版本管理,如果要引用某个特定版本的包,需要将该版本的源码手动拷贝到`$GOPATH/src`下
(3)当两个项目同时引用同一个包,但是需要引用不同版本时,此时就没有办法解决
### **VENDOR**
从Go的1.5版本开始,Go语言增加了vendor特性。该特性是为了解决上面的第三个问题,第一个和第二个问题并没有解决。
所谓vendor,就是在Go项目的根目录下,增加了一个vendor目录,把该项目依赖的包拷贝到该项目的vendor目录下。目录结果如下:
```
program1
main.go
vendor
example.com
hello
hello.go
```
当我们在`program1`目录下执行`go run main.go`时,go首先会去vendor目录下查找,查找`example.com/hello/`目录下是否有go文件中有SayHello函数。如果在vendor目录下没有找到,则再去`$GOPATH/src/`目录下进行查找。
这种机制下,我们就可以把每个项目依赖的包,拷贝到各自项目的vendor目录下,这样就可以解决上面的第三个问题。
##### **vendor相关的工具**
把依赖包拷贝到vendor目录下,手动操作,是一种过于原始和复杂的方法。所以,社区有很多的工具, 用来自动管理vendor目录。比如godep、glide等。