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

标签 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 不附带 vendor 文件夹,但开发人员在本地调用 go modvendor),go get 命令是否尊重依赖项的 vendor 文件夹(或它可以检测到该模块使用了 vendor 而没有上游 vendor 文件夹)吗?

最佳答案

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

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

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

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

关于go - 如何构建其依赖项依赖于项目依赖项的另一个版本的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61157315/

相关文章:

haskell - cabal:依赖于具有特定编译标志的包

go - 覆盖导入结构上的结构字段标签

gradle - Gradle中的选择性依赖

go - 如何在 terratest 中传递 assume 角色

java - 如何使用阴影依赖项运行单元测试?

go - 如何为 Go Mod/pkg.go.dev 消费者发布更新包?

go - 替换go.sum中的字符串

go - 从字符串列表转换为 go 中的接口(interface)列表

xml - 是否可以流解析XML父元素而不解析其子元素?