go - 相同依赖项的两个版本 - 较低版本被忽略
问题描述
我有一个项目,其中两个依赖项使用同一库的不同版本。例如,我的项目有依赖A
和依赖B
。A
并且B
,两者都使用公共库/依赖X
项,但版本不同。A
有和的v1
版本。_ 所以现在当我在我的项目中添加&作为依赖项时,我的项目中有 2 个版本的.X
B
v2
X
A
B
X
go.sum
我期待着,各个版本将在运行时由A
and引用B
。但事实并非如此。不知何故,当我在我的项目上运行测试时,A
正在使用v2
of X
,理想情况下它应该使用v1
(因为在go.mod
of 中A
,明确指定/添加v1
)。所以它破坏了执行,因为v1
和有很多差异v2
。X
那么在我的项目中,如何明确指定使用v1
byX
和A
use v2
by B
?go模块中有这样的规定吗?
解决方案
您的包必须使用后缀B
导入。X
/v2
当 v1 或更高版本的包进行向后不兼容的更改时,Recall 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"
)的末尾。
导入路径中的此版本后缀将使它们成为 2 个“不同”的包。如果A
并且B
将使用相同的主要版本X
,则不会有 2 个版本,将选择更高版本(“最小版本选择”算法)。详见版本选择。
推荐阅读
- java - Python 中是否有标准的通用 URI 处理程序?
- jquery - 我可以使用 Jquery 和变量插入刀片语法吗
- python - Python 和 Z3:整数和浮点数,如何正确管理它们?
- react-native - React Native Expo - 直接从 websocket 播放音频
- excel - Cookie 的 Web 抓取问题 - 仅在单次手动浏览器调用后才抓取值
- laravel - 在 VueJS 中的数据之后拆分数据 JSON
- javascript - 我如何映射对象的对象[Vuejs]
- wpf - 如何将 Textbox.ReadOnly 绑定到父(所有者)视图模型中的属性
- css - 如何通过 CSS 增加单个点(而不是整个虚线边框)的虚线边框大小?
- angular - 新的 Angular 9 应用程序在 Mac 上的“ng build”上出现“错误无法读取未定义的属性‘标志’”