我有一个项目,其中两个依赖项使用同一库的不同版本。例如,我的项目具有dependency A和dependency B。A和B都使用通用的库/依赖项X,但版本不同。A拥有v1的版本X和B具有v2的版本X。所以,现在当我添加A和B在我的项目依赖,有2个版本,X在我的项目的go.sum。
A
B
X
v1
v2
go.sum
我期望在运行时由A和引用各个版本B。但事实并非如此。不知怎的,当我在我的项目运行测试时,A使用v2的X,最好应使用v1(因为在go.mod中A,明确指定/加v1)。所以,它打破了执行,因为有很多在差异v1及v2的X。
go.mod
所以,在我的项目,我怎么能明确指定要使用v1的X通过A 和使用v2的B?go模块中是否有此类规定?
您的B软件包必须X带有/v2后缀。
/v2
转到Wiki:模块:语义导入版本控制:
当v1或更高版本的软件包进行向后不兼容的更改时,召回semver需要对主要版本进行更改。遵循导入兼容性规则和semver的结果称为 语义导入版本控制 ( Semantic Import Versioning) ,其中主要版本包含在导入路径中–这可确保在主要版本由于兼容性中断而增加时,导入路径会随时更改。 语义导入版本控制的结果是,加入Go模块的代码 必须遵守以下规则: 如果模块的版本为v2或更高版本,则必须/vN在go.mod文件(例如module github.com/my/mod/v2,require github.com/my/mod/v2 v2.0.0)中使用的模块路径的末尾,以及包导入路径(例如,import "github.com/my/mod/v2/mypkg")中包含的模块主版本作为。
当v1或更高版本的软件包进行向后不兼容的更改时,召回semver需要对主要版本进行更改。遵循导入兼容性规则和semver的结果称为 语义导入版本控制 ( Semantic Import Versioning) ,其中主要版本包含在导入路径中–这可确保在主要版本由于兼容性中断而增加时,导入路径会随时更改。
语义导入版本控制的结果是,加入Go模块的代码 必须遵守以下规则:
/vN
module github.com/my/mod/v2
require github.com/my/mod/v2 v2.0.0
import "github.com/my/mod/v2/mypkg"
导入路径中的此版本后缀将使它们成为2个“不同”的软件包。如果A和B将使用的相同主版本X,则将不会有2个主版本,则将选择较高版本(“最小版本选择”算法)。有关详细信息,请参见版本选择。