这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
本篇内容
- go module的最小版本选择算法原理
算法应用
升级所有的依赖项
该功能类似go module -u,将所有依赖项升级至最新并且重新输出依赖列表。在上一个例子的基础上:
首先检查可用的依赖项版本,发现C有更新的1.3版本,D有更新的1.4版本,E有更新的1.3版本,同时C V1.3引入了F和G的依赖。算法将新引入的依赖情况和旧的依赖列表进行合并输出最终结果。解决方案的核心是引入一个能重建依赖关系结构的最小依赖需求列表,通过递归访问每个依赖项的最小依赖需求列表,可以重建上图的整个依赖树。
A的最小化列表只包含B,C,D,E四个依赖项,其中D、E有
indirect标记。由于D和E的最新版本均不会出现在BC的最新版本的最小依赖列表中,所以要在根列表指明最新的版本以方便更新。如果不将D1.4和E1.3添加到go.mod,那么最终模块A1的依赖构建结果就会是D1.3以及E1.2。
而A的列表并不会包含F和G,因为F的最新版存在于C的最小依赖项列表中,G存在于F的依赖文件中。因此在遍历C和F的依赖项列表时可以恢复出F和G的依赖关系,所以不需要在C中列出这两项。
使用indirect标记的依赖项一般有两种情况:
- 某个依赖项没有使用go module管理
- A1希望指定某个间接依赖项的版本
构建完最小依赖列表后,就可以递归每个依赖项的依赖列表,从而构建整个依赖树。
下篇内容
- 升级/降级单个依赖项的算法