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

Seb*_*020 2 go dependency-management vendoring go-modules

想象一下您有一个项目需要两个模块AB。我将调用项目模块P。可以说,这P需要A v1.0.0B v1.1.0A需要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)
Run Code Online (Sandbox Code Playgroud)

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

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

Eli*_*sky 5

这似乎是模块系统无法解决的冲突。由于 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 
Run Code Online (Sandbox Code Playgroud)