假设您有一个项目需要两个模块 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
不附带 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/