我们要学会站在巨人的肩膀上,在开发项目中利用已经封装好的、经过验证的开发组件或工具来提升自己的研发效率。依赖即各种开发包。
依赖管理是实际工程开发中的一个重要概念,这一篇是我在第六届字节跳动青训营后端进阶班的第五篇笔记,梳理Go的依赖管理课程的内容,主要涉及Go依赖管理的演进路线和Go Module实践。
Go依赖管理的演进
类似hello world的单体函数只需要依赖原生SDK,而实际工程会更多的关注业务逻辑的实现,其他的涉及框架、日志、driver、以及collection等一系列依赖都会通过sdk的方式引入,所以对依赖包的管理尤为重要。
Go的依赖管理主要经历了3个阶段,分别是Gopath、Go Vender、目前被广泛应用的Go Module,整个演进路线主要围绕实现两个目标来迭代发展:
- 不同环境(项目)依赖的版本不同;
- 控制依赖库的版本。
Gopath
GOPATH是Go语言支持的一个环境变量,value是Go项目的工作区。目录有以下结构:
- src:存放Go项目的源码;
- pkg:存放编译的中间产物,加快编译速度;
- bin:存放Go项目编译生成的二进制文件。
但是在gopath管理模式下,如果多个项目依赖同一个库,则依赖该库是同一份代码,所以不同项目不能依赖同一个库的不同版本,已经不能满足我们的项目依赖需求。为了解决这问题,出现了Go Vender。
Go Vender
Vendor 是当前项目中的一个目录,其中存放了当前项目依赖的副本。在Vendor机制下,如果当前项目存在Vendor目录,会优先使用该目录下的依赖,如果依赖不存在,会从GOPATH中寻找;这样解决了多个项目需要同一个package依赖的冲突问题。
但vendor无法很好解决依赖包的版本变动问题和一个项目依赖同一个包的不同版本的问题,更新项目有可能出现依赖冲突、导致编译出错。于是Go Module应运而生。
Go Module
Go Module是Go语言官方推出的依赖管理系统,解决了之前依赖管理系统存在的诸如无法依赖同一个库的多个版本等问题,从Go 1.11 开始实验性引入,Go 1.16 默认开启;通常读为Go Mod。
Go Module通过go.mod文件管理依赖包版本,通过go get/go mod指令工具管理依赖包,实现了定义版本规则和管理项目依赖关系。具体使用见go.dev/blog/using-…