小编典典

具有相同依赖项的两个版本-较低版本被忽略

go

我有一个项目,其中两个依赖项使用同一库的不同版本。例如,我的项目具有dependency A和dependency
BAB都使用通用的库/依赖项X,但版本不同。A拥有v1的版本XB具有v2的版本X。所以,现在当我添加AB在我的项目依赖,有2个版本,X在我的项目的go.sum

我期望在运行时由A和引用各个版本B。但事实并非如此。不知怎的,当我在我的项目运行测试时,A使用v2X,最好应使用v1(因为在go.modA,明确指定/加v1)。所以,它打破了执行,因为有很多在差异v1v2X

所以,在我的项目,我怎么能明确指定要使用v1X通过A 和使用v2B?go模块中是否有此类规定?


阅读 295

收藏
2020-07-02

共1个答案

小编典典

您的B软件包必须X带有/v2后缀。

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

当v1或更高版本的软件包进行向后不兼容的更改时,召回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个“不同”的软件包。如果AB将使用的相同主版本X,则将不会有2个主版本,则将选择较高版本(“最小版本选择”算法)。有关详细信息,请参见版本选择

2020-07-02