2

想象一下,您有一个需要两个模块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.0A只用 构建v1.0.0

依赖图:

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

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

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

4

1 回答 1

4

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

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

缺少这一点,您可以将B分叉成一个单独的模块(与原始 B 具有不同的模块名称)并在 A. Create 中使用旧版本BFORK=Bv1.0.0,然后您将拥有:

P -> B (v1.0.0)
A -> BFORK vX.X.X 
于 2020-04-11T13:50:48.667 回答