项目开发难管理?那就来学习下依赖管理!|青训营笔记

85 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

在从小白到一个合格程序猿的旅程中,有无思考过一个问题:如何从一行行代码,构建出一个完整而宏大的软件的?
而想要深入对项目开发进行了解,对于依赖管理相关知识的认知必不可少。正是依赖管理才能简化开发者项目开发的难度,专注于代码的编写。在介绍依赖管理之前,请允许我先把上一篇文章的GO语言进阶进行介绍。

1. GO语言进阶

1.1 并发与并行(3:22)

如果读者以前接触过计算机系统相关的知识,这一条可以直接划走了,在这里我要介绍计算机相关知识:并发与并行。
什么是并发呢?并发是指多线程程序在一个核的cpu上交替进行。用通俗易懂的语言举例子的话就是:一个人(指cpu)在吃饭的时候,吃一口饭,然后再去喝一口水,是一个交替进行的过程,两件事在某一时间段是同时进行的。
而什么是并行呢?并行指多线程程序在多个核的cpu上运行。用通俗来讲:就是一个人(看成一个多核cpu)在听音乐的同时去吃饭,两件事在某一时刻是同时进行的。

1.2 协程与线程(4:15)

在了解了并发与并行的定义后,紧接着介绍的就是GO语言独有的协程概念了,而与之类似的还有线程:

  • 协程:用户态,轻量级线程,栈KB级别

  • 线程:内核态,线程并发跑多个协程,栈MB级别

    可以说协程是GO语言应对高并发的场景下,而产出的优化方案。相比于线程,协程所需要的系统开销更小,所以协程我们可以认为是轻量化的线程。(值得注意的是协程处于用户态,线程处于内核态,如果读者对用户态和内核态不太了解,可以参考以下链接的文章:从根上理解用户态与内核态 - 知乎 (zhihu.com)

1.3 CSP:协程间的通信(7:40)

对于协程间的通信,GO提倡通过通信共享内存,而不是通过共享内存实现通信。

  • 通过通信共享内存:通道,像传输队列,先入先出

  • 通过共享内存进行通信:使用互斥量,对临界区加锁。

    对于使用通道共享内存,最重要的则是Channel(10:05)。
    其构造方法为:make(chan 元素类型,[缓冲大小])对于Channel可以划分为两类:

  • 无缓冲通道(也被称为同步通道) make(chan int)

  • 有缓冲通道 make(chan int,2)

1.4 并发安全 Lock(15:00)

对于互斥量可以进行加锁,而WaitGroup(18:00)则为计数器,用于阻塞主协程。开启协程+协程数,而当协程结束时计数-1,主协程阻塞到计数器为0 ,其相关三个方法为:add,done,wait

2. 依赖管理

2.1 背景

由于工程项目不可能基于标准库0~1编码搭建所以我们可以采取管理依赖包的方法,实现对项目开发难度的简化。而GO依赖管理的变更推进(22:30)则是:GOPATH=》Go Vendor=》Go Module
GOPATH(23:10):GOPATH即GO项目的工作区,在这个目录下:

  • bin——项目编译的二进制文件
  • pkg——项目编译的中间产物,加速编译
  • src——项目源码

而项目依赖即是项目代码直接依赖src下的代码。 弊端:若依赖于某一package的不同版本,无法实现package的多版本控制。

Go Vendor(25:50):在项目目录下增加vendor文件夹,所有依赖包副本形式放$ProjedctRoot/vendor 从vendor获取,如果没有到GOPATH获取
弊端:无法控制依赖的版本,更新项目又可能出现依赖冲突,导致编译出错。
Go Moudle(27:55):通过go.mod文件管理依赖包版本,通过go get/go mod 指令工具管理依赖包

2.2 依赖管理三要素(28:48)

  • 配置文件,描述依赖 go.mod

  • 中心仓库管理依赖库 Proxy

  • 本地工具 go get/mod

2.3 go.mod(29:55)

go.mod依赖管理基本单元、原生库(go的版本号)、单元依赖。而在go.mod中,依赖标识为: [Module Path][Version/Pseudo-version]
而对于依赖配置-version,有两种表述方式:

  1. 语义化版本${MAJOR}.${MINOR}.${PATCH}
  • MAJOR:大版本,代码不兼容,代码隔离
  • MINOR:做一些新增函数等,代码兼容
  • PATCH:做一些代码上bug的修复
  1. 基于commit伪版本:vX.0.0-yyyymmddhhmmss-abcdefgh1234
    第一部分与语义化版本一样。第二部分是修改提交的时候的时间戳。第三部分提交commit时生成的hash前缀

2.4 更多

还有更多相关知识,在这儿不做一一赘述,如下所示,可去视频进行详细了解:

  • 依赖配置-indirect(34:05)

  • 依赖配置-incompatible(34:40)

  • 依赖配置-依赖图(36:10)

  • 依赖分发-回源(38:10)

  • 依赖分发-Proxy(40:20)

  • 依赖分发-变量GOPROXY(41:33)

  • 工具-go get(42:50)

  • 工具-go mod (43:40)

    ps:相关实验将单开一篇进行讲解。