首页 > 解决方案 > 相同依赖项的两个版本 - 较低版本被忽略

问题描述

我有一个项目,其中两个依赖项使用同一库的不同版本。例如,我的项目有依赖A和依赖BA并且B,两者都使用公共库/依赖X项,但版本不同。A有和的v1版本。_ 所以现在当我在我的项目中添加&作为依赖项时,我的项目中有 2 个版本的.XBv2XABXgo.sum

我期待着,各个版本将在运行时由Aand引用B。但事实并非如此。不知何故,当我在我的项目上运行测试时,A正在使用v2of X,理想情况下它应该使用v1(因为在go.modof 中A,明确指定/添加v1)。所以它破坏了执行,因为v1和有很多差异v2X

那么在我的项目中,如何明确指定使用v1byXA use v2by B?go模块中有这样的规定吗?

标签: gomoduledependenciesdependency-managementgo-modules

解决方案


您的包必须使用后缀B导入。X/v2

Go Wiki:模块:语义导入版本控制:

当 v1 或更高版本的包进行向后不兼容的更改时,Recall semver需要更改主要版本。遵循导入兼容性规则和 semver 的结果称为Semantic Import Versioning,其中主要版本包含在导入路径中——这确保了在主要版本由于兼容性中断而增加时,导入路径会随时更改。

由于语义导入版本控制,选择加入 Go 模块的代码必须遵守以下规则:

  • 如果模块是 v2 或更高版本,则模块的主要版本必须包含/vN在 go.mod 文件中使用的模块路径(例如,,module github.com/my/mod/v2require github.com/my/mod/v2 v2.0.0和包导入路径(例如,import "github.com/my/mod/v2/mypkg")的末尾。

导入路径中的此版本后缀将使它们成为 2 个“不同”的包。如果A并且B将使用相同的主要版本X,则不会有 2 个版本,将选择更高版本(“最小版本选择”算法)。详见版本选择


推荐阅读