我最近在我的 Go 项目中添加了一个功能,它可能会破坏使用它的其他项目。我决定通过添加一个匹配的 git 标签 2.0.0
来为这个项目添加一个主要版本“A”。 (以前是 1.x.x
)。
在我的另一个需要它的项目“B”中,我更新了它的 go.mod
像这样的文件:
module gitlab.mydomain.com/namespace/B
go 1.12
require (
gitlab.mydomain.com/namespace/A v2.0.0
)
可以看到,我特别提到了
v2.0.0
,但是一旦我运行 B,A 的版本就会被 v0.0.0-<timestamp>-<revision>
覆盖.我确保标签存在于 Remote 中。
我在这里想念什么?
最佳答案
从主要版本开始 2
(v2
及以后),您必须修改导入路径,您必须将主要版本添加为导入路径的后缀。您必须将包导入为:
import "gitlab.mydomain.com/namespace/A/v2"
这也必须出现在
go.mod
像:require gitlab.mydomain.com/namespace/A/v2 v2.0.0
由于主要版本代表 Semver 中的不兼容更改,因此它们的导入路径也必须不同(相同的导入路径表示相同的依赖项)。这是import compatibility rule :
If an old package and a new package have the same import path,
the new package must be backwards compatible with the old package.
在 Go Modules Wiki: Why must major version numbers appear in import paths? 中了解更多信息
并且也在博客文章中:The Go Blog: Go Modules: v2 and Beyond
关于git - Go 模块在 go.mod 中用 v0.0.0-<timestamp>-<revision> 替换显式版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59268347/