Go-包管理三部曲(GOPATH、GOVENDOR、go mod)

一、前言

Go语言经历了许多年的发展,一开始Go对于包的管理并不完善。时至今日,Go语言引入了go mod 才算是彻底解决了Go包管理杂乱的问题。

目前Go语言包管理分为3个流派,分别是使用GOPATH管理、使用GOVENDOR管理、使用go mod管理。

目前大多数github上的go 包项目都已经完成了向go mod 管理包的转换。

 

二、Go 包管理三部曲

1、最早的包管理方式—GOPATH

使用GOPATH管理包是最早的方式,编译时Go会去GOPATH目录下找到对应的包。

但是存在一个问题,就是一个项目中会有多个小组,由于时间问题,每个小组使用的包的版本可能不一样,这个问题如果使用GOPATH来管理包,就没有好的解决方案。

基于此,Go又推出了第二种包管理方式GOVENDOR。

2、GOVENDOR

使用GOVENDOR来管理包是基于使用GOPATH管理包存在的问题提出的解决方案。

每一个子项目下都有一个vendor目录,自己的项目所用到的包放在自己的vendor目录下。比如项目组a和项目组b都用到了github的zap包,但是因为开发时间不同,使用的zap包版本不一样,这时,就可以将包拉取到自己项目下的vendor目录,以此实现一个大项目下,多个子项目使用不同版本的同一个包。

Go在编译时,会自动先去vendor目录下找对应的包,如果vendor目录下找不到对应的包,会继续在GOPATH中找。

但这样处理,也有很多问题,比如

基于此,Go在后面推出了一个比较完善的包管理方式,就是 go mod

3、go mod

go mod 是三个包管理方式中最晚推出的,也解决了前两个包管理方式存在的弊端。

我们可以通过一定方式,很简单的就将通过GOPATH或GOVENDOR管理包的项目转换到go mod方式管理。

4、如何选择

新项目直接选择go mod。

已经选择了通过GOPATH 或 GOVENDOR 来管理包的老项目可以通过命令非常简单的就转换到go mod方式。