Golang 多版本依赖并存实现

738 阅读2分钟

背景描述

有时候, 我们一个项目随着开发迭代的发展, 可能既要兼容旧的版本,又要适配新的版本。 这个时候, 就很可能对一个依赖模块的不同版本产生依赖。 接下里, 我会探讨下在 Golang 中, 如果实现同一个模块的多版本依赖并存的实现。

Golang 多版本现状

我们知道 Golang 目前是通过 Gomod 来实现模块版本管理的, 但是 Gomod 默认只会加载一个模块的最新版本, 旧的版本会直接忽略掉。 而想要多版本依赖在一个项目中并存, 就需要另想办法了。 目前我有如下方式可以实现一个模块的多版本并存。

实现方式

  • vendor 机制实现多版本依赖
  • 模块切割实现多版本依赖

vendor 机制实现多版本依赖

Golang 的依赖管理机制中, 是存在 vendor 机制的, 如果在项目中没有启用 Go Module 机制, 那么 vendor 机制将生效。

vendor 机制的具体内容, 此处不多做介绍, 不了解的请自行谷歌, 如有必要, 以后也会介绍下。

以 kubernetes 项目为例: image.png

可以看到上图中, 项目根目录下有个 vendor 目录, 里面放置了 kubernetes 项目所有的依赖(go mod vendor 命令可以快速将 mod 依赖导入 vendor 目录), 其中可以看到 gopkg.in/yaml.v2gopkg.in/yaml.v3两个不同版本的依赖, 虽然这里是官方把两个版本切割为了两个模块, 但是我们自己也可以把小版本的同一个模块做成 vendor 下的两个目录中, 成为两个不同的依赖。

模块切割实现多版本依赖

模块切割实现多版本依赖并存的原理就更加简单了, 我们可以在自己的 github 账户中, 对同一个模块创建两个不同名字的 repo,那么就实现了通过 gomod 去管理不同版本的依赖并存。

不过, 这种需要自己在 repo 中去适配模块名修改后导致的所有 import 路径的适配。