今天学习了一下GO语言的依赖管理,简单做个笔记来复习
依赖冲突
简单来说依赖管理就是处理依赖的项目之间的关系,避免依赖冲突, 依赖冲突的定义就是一个项目的不同部分调用的资源库/代码包的版本不同,因而产生一系列问题
GO的依赖管理
go语言的依赖管理总共经历了三个阶段: GOPATH --> Go Vendor --> Go Module
1.GOPATH
GOPATH是go的环境变量,其value是go项目的工作区,目录的结构如下
go项目会直接依赖src目录下的源码,使用指令更新版本时也会直接更新到src目录下. 这种依赖管理模式的局限性十分明显,由于src目录下的源码是唯一的不因项目的改变而改变的,当项目遇到需要多版本控制时无法实现
2.Go Vendor
Go Vendor的出现能够解决这一问题,其改变了目录的结构,增加了一个vendor目录.
vendor是src目录的一个副本补充,所有依赖包的副本存放于vendor目录中, go项目会优先先使用vendor目录的依赖若没有再使用src目录的依赖.其不同于src的唯一固定,每个项目vendor中的内容都可以不同,因此也解决了多版本控制的问题 但也只是解决了这一问题,这种依赖管理方式无法解决依赖冲突的问题
3.Go Module
前两种方法比较像是基于原有问题打了个补丁,而Go Module则是设计了一个专门的解决方案,如同java的maven一样.
分析依赖管理后有三个要素,go分别解决了这三个问题
3.1配置文件,描述依赖-go.mod
依赖管理基本单元是模块的路径,即从哪里引入该模块.原生库是表明了go的版本.单元依赖则是具体的依赖单元 的路径即版本号
3.2中心管理依赖库-Proxy
引入依赖时项目不会直接从如github般的代码托管平台直接下载,这违背代码托管平台的业务目标,同时 也会带来依赖无法保证稳定性,加大第三方平台负载的一些理问题. Proxy负责解决这些问题,其会进行一个代理Proxy会将代码托管平台的代码下载下来,专门负责依赖导入的问题,进行依赖分发
3.3本地工具-go get/mod
go get/mod提供了一些指令对本地项目进行一些处理