Hero Image
「Go」依赖管理 Go Modues/ GOPATH

不要吝啬你的批评与感悟,敬请留言,我们一起进步。 如果你有过以下问题,欢迎阅读文章,提出意见与建议 go mod 怎么使用? GOPATH是什么? GO111MODULE="" 这个参数决定了什么? go get、go download 有什么区别? import到底import的什么东西? 依赖管理工具 用过Java 的同学都知道,对依赖的管理经历了从原始的手动引入jar包,到使用maven等自动化管理工具去引入第三方依赖的过程,从而可以使用别人已经开发好的优秀工具。如果使用过Python的同学可能会熟练的使用pip install 第三方的工具包。Java 和Python的第三方工具包都是集中式管理的,使用maven 或者是pip 都是从对应的管理中心下载更新依赖。当然还有 npm、yarn、gradle等其他语言的依赖版本工具。 在go语言中,第三方依赖的管理工具经过了一个漫长的发展过程。在GO1.11 发布之前govendor、dep等工具百花齐放。直到go mod 出现,开始一统天下。go 的依赖非常简单粗暴,只要依赖源码就可以了。例如: 1import "github.com/jinzhu/gorm" github.com/jinzhu/gorm 就是gorm的GitHub项目路径。 GOPATH时期 Go 在1.11 之前使用GOPATH模式进行依赖的管理。安装部署go环境,使用go 进行开发的时候强制被要求要设置GOPATH(当然安装过程中也会默认指定$GOPATH=~/go)。 要在GOPATH路径下新建 /src /bin /pkg文件夹。 1➜ ~/go 2├── bin # 存储go编译生成的二进制可执行文件,一般会把该路径配置到PATH中,PATH=$PATH:$GOPATH/bin 3├── pkg # 存储预编译的目标文件,以加快后续的编译速度 4└── src # 存储Go的源代码,一般以$GOPATH/src/github.com/foo/bar的路径存放 1➜ ~ go env |grep GOPATH 2GOPATH="/Users/bytedance/go" 在这种模式下,如果使用go get 拉取外部依赖会自动下载并安装到$GOPATH/src 目录下。 这种模式下,go get没有版本管理的概念,无法处理依赖不同版本的问题,因为同一个依赖都存在同一个路径下面。 在Go官方还没有推出Go Modules 的时候,go的依赖管理工具可谓是百花齐放,例如 govendor, dep,但是最终Go Modules发布,平息了诸侯割据的局面。