如何导入同一个go模块的两个版本?

rhu*_*idh 14 go go-modules

我有这个问题:

  • 模块 A 导入模块 X v0.1.0
  • 模块 B 导入模块 X v0.2.0
  • 我在我的项目中导入了 A 和 B。

Golang 选择了 X v0.2.0 并称它很好。但这并不好。v0.1 和 v0.2 的不同足以导致 A 中断并且我的项目无法编译。

我必须采取什么措施来解决这个问题?

Go 的官方立场似乎是“X 的开发者做错了,应该在重大更改后发布一个主要版本”。但这对目前的情况没有帮助。

我找不到实际解决方案的讨论。


更多信息

  • 上面是一个简化,A 和 B 还有一些依赖项也依赖于 X。
  • 这个项目需要由一群人来维护。因此,将 A 和 B 更新到新版本非常简单。
  • 这是安全关键型代码,因此依赖项不匹配导致的细微错误值得关注。

我尝试过的事情:

  • 分叉 A 和 X,更改整个导入路径,并更新 A 的go.mod. 它可以工作,但会使这些模块的更新缓慢且容易出错。
  • 从 A 和 X 中复制并粘贴所需的代码以避免导入它。而且速度慢且容易出错。
  • 深入研究了 的创意应用go mod vendor,但找不到解决方案。

wal*_*yqs 5

例如,您可以创建两个模块的本地副本,并使用替换指令和伪主要版本来使用不同标签导入同一存储库的多个版本:

replace moduleX/v1010 => ./src/moduleX/0.1.0

replace moduleX/v1020 => ./src/moduleX/0.2.0
Run Code Online (Sandbox Code Playgroud)

然后在您的项目中将根据需要使用任一版本:

import (
  moduleX_010 "moduleX/v1010"
  moduleX_020 "moduleX/v1020"
)
Run Code Online (Sandbox Code Playgroud)


bcm*_*lls 2

这里理想的解决方案是向 module 提交上游 PRA以使其兼容X v0.2.0,然后更新自己的 module 以使用 module 的固定版本A

A如果您在等待上游维护者响应 PR 时需要临时插入模块修复程序,则可以使用replace指令来完成此操作。(有关更多详细信息,请参阅https://golang.org/doc/modules/managing-dependency#tmp_11。)