dubbo-go v3 版本 go module 踩坑记

该问题源于我们想对 dubbo-go 的 module path 做一次变更 , 使用 dubbo.apache.org/dubbo-go/v3 替换之前的 github.com/apache/dubbo-go 。 首先 , 我们做了路径映射 , 在 dubbo.apache.org 下放置了一个 dubbogo/v3 文件 , 内容如下:


dubbo-go v3 版本 go module 踩坑记
本文插图

其次 , 我们修改了 go.mod 的 module 和对应的所有 import , 并修改了所有子模块引用 dubbo-go 使用的 module 路径 。 在做完上述的修改后 , 我们提 PR 时 , 发现 CI 失败 , 经过进一步的日志排查 , 我们确定是 CI 在跑集成测试时发生了错误 , 具体的错误提示信息如下:

dubbo-go v3 版本 go module 踩坑记
本文插图
这一段的执行逻辑是希望利用 docker 对 dubbo-go 中的集成测试内容构建镜像 , 并启动容器进行测试 , 该镜像打包所用的 Dockerfile 路径在 github.com/apache/dubbo-go/test/integrate/dubbo/go-server 目录下 , 对照错误日志的 STEP 标识 , 我们可以定位到具体错误发生下面的两个步骤:在 STEP 9 中 , 我们使用 go mod edit -replace 替换了 dubbogo 的依赖路径 , 将其替换为发起 PR 请求的仓库地址和 commit id 。 在此基础上 , 当镜像构建跑到 STEP11, 尝试使用 go mod tidy 拉包时发生了错误 。 回过头查看错误日志 , 我们可以发现:
【dubbo-go v3 版本 go module 踩坑记】
dubbo-go v3 版本 go module 踩坑记
本文插图
由于我们只指定了 commit id , 因此在 go mod 实际运行过程中 , 它会为我们生成一个假定版本号(关于假定版本号的更多说明可以查看本文最后的问题拓展) , 这个假定版本号抓取远程仓库的最新有效 tag 为 v1.4.1【注:此处远程仓库为 github.com/Mulavar/dubbo-go , 这是我自己的 dubbo-go 分支 , 该分支拉取 fork 的时间比较早 , 其最后 tag 是 v1.4.1】 , 并自增为 v1.4.2 , 主版本是 v1 。 但在先前 , 我们的 dubbogo module path 是声明为 dubbo.apache.org/dubbogo/v3 , 主版本是 v3 , 这导致了 前后的依赖主版本分别是 v3 和 v1, 出现了不一致 , 实际拉取 dubbogo 依赖的时候出错 。 这一步 , 我们使用 时将一个 v3 版本的 go module 替换成了一个 v1 版本的 module , 导致主版本不一致发生错误 , 因此我们只需在替换依赖路径时指定替换后的 module 主版本也为 v3 即可 , 我们在 go mod edit -replace 后的模块依赖路径后也加上 v3 后缀如下所示 。 修改前:? 修改后:
修复该问题后我们提交代码查看 CI , 在 STEP 8 打印的日志信息中 , 可以看到替换后的 dubbogo 路径多了 v3 , 并且在拉包的时候跟的版本号(