这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
本篇内容
- 最小版本选择算法单个模块升级的实现
- 最小版本选择算法单个模块降级的实现
算法应用
升级单个模块
相比一次性升级所有模块,比较好的方式是只升级其中一个模块,并尽量少地修改构建列表。例如将依赖C升级到1.3版本,则不需要修改D和E的依赖,只需要引入新的依赖及升级必要的依赖项,并输出新的依赖列表:
当升级某个模块时,依赖关系图中这个依赖项本身就被移至更高的版本(1.2->1.3)并引入1.3新引入的依赖项,即F和G。新的原始构建依赖项(rough build)由新引入的依赖项和原有的未修改的依赖项合并组成,并在最后简并依赖项输出最终的依赖项列表。
构建后的rough build:
1. A 1
2. B 1.2
3. C 1.3
4. D 1.3
5. D 1.4
6. E 1.2
7. F 1.1
8. G 1.1
合并后的A的最小最终依赖项列表:
1. A 1
2. B 1.2
3. C 1.3
4. D 1.4
最终构建列表模块D为1.4,因为升级过程只会升级依赖项或者引入新依赖,而不会减少依赖或者降级依赖,因为这不符合最小改动原则。因此最后D的依赖版本为1.4。
降级单个模块
降级模块的算法和升级类似,在构件图中删除指定的模块,同时回溯删除依赖高版本的模块直至所有依赖待删除的高版本模块的依赖全部被删除。例如将D降级到1.2版本:
research.swtch.com/version-sel…
直接依赖D1.2版本以上的依赖有B1.2和C1.2,因此将B和C降级到不依赖D1.3及以上的最新版本B1.1和C1.1。之后将B1.1和C1.1的模块递归引用,同时保留不涉及的模块,以达到最小修改的效果。
下一篇内容
- go module命令的使用