目前,我正在将Go 1.11模块用于多个存储库。现在,我正在处理的是1.x版本。结合移动模块,我进行了一些其他重大更改,因此很明显是时候增加主版本库了。这意味着要转到版本2。
每个“执行命令”文档:
为保持导入兼容性,go命令要求主版本为v2或更高版本的模块使用主版本为最终元素的模块路径。例如,example.com / m的v2.0.0版本必须改为使用模块路径example.com/m/v2,并且该模块中的软件包将使用该路径作为其导入路径前缀,例如example.com/m/v2 / sub / pkg。以此方式在模块路径和导入路径中包含主要版本号称为“语义导入版本控制”。
这是否像更新我的go.mod
文件的第一行,并将/v2
附加到模块名称那样简单?还是应该在我的存储库中创建一个v2/
目录并将所有文件移入其中?
答案 0 :(得分:1)
有两种方法可以转移到版本2:分支和子目录。您可以在https://research.swtch.com/vgo-module上详细了解它们(有更好的插图)。
这两个选项使一个版本可以依赖另一个版本。例如,当您实现版本2时,可以将版本1更新为依赖于版本2(但保持相同的v1 API)。然后,您只需要为库提供一种逻辑实现即可。根据项目的类型,您要提供的支持以及所需的修复程序,这可能对您不太起作用。
master: A -> B (v1.0.0) -> D (v1.0.1)
\
v2: -> C (v2.0.0)
在这种情况下:
master
分支上启动项目,A
和B
)v1.0.0
。git checkout -b v2
)并进行重大更改。现在必须更新go.mod,以便模块名称以/v2
结尾(实际上是一个新模块!)。v1
中的错误,因此回到该分支,进行新的提交并标记新的v1
版本。当用户需要特定版本的模块时,go
会在两个分支中寻找合适的模块。
如果您不想在分支机构上发展怎么办?您可以为每个主要版本创建一个子目录。版本1停留在顶层,然后新版本移入子目录:
go.mod (module example.com/foo)
foo.go
v2/
go.mod (module example.com/foo/v2)
foo.go
当您用新版本标记此仓库时,v1
将使用顶级版本。 v2
标签将使用v2
子目录。
答案 1 :(得分:0)
来自模块Wiki的Releasing Modules (v2 or Higher)部分:
有两种可供选择的机制来发布v2或更高版本的模块。 请注意,使用这两种技术,新的模块版本将变为 当模块作者推送新标签时,可供消费者使用。 以创建
v3.0.0
版本的示例为例,两个选项是:
- 主要分支:更新
go.mod
文件,使其在/v3
指令的模块路径末尾包含一个module
(例如{{1 }})。更新模块中的导入语句 也可以使用module github.com/my/module/v3
(例如/v3
)。 用import "github.com/my/module/v3/mypkg"
标记发布。
- Go版本1.9.7 +,1.10.3 +和 1.11+能够正确使用并构建使用此方法创建的v2 +模块,而无需更新尚未使用的消费者代码 尚未选择使用模块(如"Semantic Import Versioning"中所述 以上部分)。
...
- 主要子目录:创建一个新的
v3.0.0
子目录(例如v3
),然后在该子目录中放置一个新的my/module/v3
文件。 模块路径必须以go.mod
结尾。将代码复制或移动到/v3
子目录。将模块内的import语句更新为 使用v3
(例如/v3
)。标记 用import "github.com/my/module/v3/mypkg"
释放。
但是,section中还有其他一些值得回顾的细节。
这里值得一提的一点是,如果您对自动化方法感兴趣(例如,可能需要访问许多文件),那么https://github.com/marwan-at-work/mod是一个很好的自动化解决方案,它可以自动在您的v3.0.0
代码和/vN
中添加,删除或更改所需的*.go
。有关更多详细信息,请参见this answer。