假设您有一个需要两个模块A
和B
的项目。我将调用项目模块P
。假设P
需要A v1.0.0
,B 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命令是否尊重依赖关系的供应商文件夹(或者是否可以检测到该模块使用了供应商没有上游供应商文件夹)?
答案 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