如何构建依赖项依赖于另一个版本的依赖项的golang项目

时间:2020-04-11 13:09:56

标签: go dependency-management go-modules vendoring

假设您有一个需要两个模块AB的项目。我将调用项目模块P。假设P需要A v1.0.0B v1.1.0,而A需要B v1.0.0。此外,B没有遵循语义版本控制规则,因此v1.0.0 -> v1.1.0的版本更改引入了重大的API更改。所以 P仅使用v1.1.0构建,而A仅使用v1.0.0构建。

依赖图:

P -> A (v1.0.0) -> B(v1.0.0)
P -> B (v1.1.0)

有什么方法可以用不同的版本来构建这个项目。我听说过供应商,但是我不确定这是否会导致依赖项使用其他B模块版本。

如果它可以为冲突的软件包版本提供解决方案,那么如果依赖项在其git存储库中不包含vendor文件夹(有人说,您不应该上传该vendor文件夹),那么go工具是否可以使用vendor识别模块(在这种情况下,模块A并未附带供应商文件夹,但是开发人员在本地调用了go mod vendor),go get命令是否尊重依赖关系的供应商文件夹(或者是否可以检测到该模块使用了供应商没有上游供应商文件夹)?

1 个答案:

答案 0 :(得分:2)

这似乎是模块系统无法解决的冲突。由于Go使用语义版本控制,因此它将尝试获取B v1.1.0来解决这两个依赖关系,如果A无法与B 1.1.0一起使用,则构建将中断。

解决此问题的最佳方法是通过不破坏非主要版本的API来修复B。

如果没有,您可以将B叉到一个单独的模块(模块名称与原始B不同),并在A中使用旧版本。创建BFORK=Bv1.0.0,然后您将具有:

P -> B (v1.0.0)
A -> BFORK vX.X.X