Go 依赖管理及项目架构学习笔记5| 青训营笔记

68 阅读2分钟

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

本篇内容

  • go module的最小版本选择算法原理

算法需求

最小版本选择算法目标是解决go module的依赖确定,即确定所有项目本身和项目依赖需要的依赖项和版本。每个依赖项有且只能有一个确定的拉取版本适合所有依赖该依赖项的依赖。该算法输入每个依赖项的依赖和版本,输出一个最后确定的总的依赖项列表。 算法应该具有以下功能:

  1. 生成当前项目的依赖和版本列表
  2. 升级所有依赖到最新版本
  3. 升级指定依赖到指定版本
  4. 降级指定依赖到指定版本

最小版本选择算法中的最小有下列含义:

  • 最小的修改操作,即尽可能不修改或者少修改依赖项给出的依赖版本
  • 最小的需求列表,即不引入项目和依赖不需要的依赖项
  • 最小的模块版本,即为了保持依赖的稳定普适,依赖项的版本应该是项目所需要的最小的版本,并非模块实际的最小版本或最大版本。

算法应用

构建依赖列表

该功能要求算法从一个空的依赖列表开始,构建项目的依赖项列表。假设项目具有下面的依赖关系:

image.png

A为项目自身,其余为项目的依赖项和依赖项的依赖项,同时存在冗余的依赖。算法通过遍历上面的依赖树构建依赖列表。通过从项目根节点A出发递归遍历,得到一个原始未优化的依赖表:

1. A 1
2. B 1.2
3. C 1.2
4. D 1.3
5. D 1.4
6. E 1.2

这一步排除了冗余的依赖项。下一步将原始的依赖表按照上述的最小化原则进行约简。对于冲突的版本,通过选取最新版本构建final build list:

1. A 1
2. B 1.2
3. C 1.2
4. D 1.4
5. E 1.2

下篇内容

  • 最小版本选择算法其他功能的实现