背景描述
有时候, 我们一个项目随着开发迭代的发展, 可能既要兼容旧的版本,又要适配新的版本。 这个时候, 就很可能对一个依赖模块的不同版本产生依赖。 接下里, 我会探讨下在 Golang 中, 如果实现同一个模块的多版本依赖并存的实现。
Golang 多版本现状
我们知道 Golang 目前是通过 Gomod 来实现模块版本管理的, 但是 Gomod 默认只会加载一个模块的最新版本, 旧的版本会直接忽略掉。 而想要多版本依赖在一个项目中并存, 就需要另想办法了。 目前我有如下方式可以实现一个模块的多版本并存。
实现方式
- vendor 机制实现多版本依赖
- 模块切割实现多版本依赖
vendor 机制实现多版本依赖
Golang 的依赖管理机制中, 是存在 vendor 机制的, 如果在项目中没有启用 Go Module 机制, 那么 vendor 机制将生效。
vendor 机制的具体内容, 此处不多做介绍, 不了解的请自行谷歌, 如有必要, 以后也会介绍下。
以 kubernetes 项目为例:
可以看到上图中, 项目根目录下有个 vendor 目录, 里面放置了 kubernetes 项目所有的依赖(go mod vendor 命令可以快速将 mod 依赖导入 vendor 目录), 其中可以看到 gopkg.in/yaml.v2 和 gopkg.in/yaml.v3两个不同版本的依赖, 虽然这里是官方把两个版本切割为了两个模块, 但是我们自己也可以把小版本的同一个模块做成 vendor 下的两个目录中, 成为两个不同的依赖。
模块切割实现多版本依赖
模块切割实现多版本依赖并存的原理就更加简单了, 我们可以在自己的 github 账户中, 对同一个模块创建两个不同名字的 repo,那么就实现了通过 gomod 去管理不同版本的依赖并存。
不过, 这种需要自己在 repo 中去适配模块名修改后导致的所有 import 路径的适配。