为了账号安全,请及时绑定邮箱和手机立即绑定

将存储库升级到 v2

将存储库升级到 v2

Go
慕仙森 2023-05-08 16:29:32
此时我正在为多个存储库使用 Go 1.11 模块。现在我正在处理一个已经是 1.x 版本的。结合移动到 go 模块,我做了一些其他重大更改,所以很明显是时候增加存储库的主要版本了。这意味着转到版本 2。根据“go command”文档:为了保持导入兼容性,go 命令要求具有主要版本 v2 或更高版本的模块使用以该主要版本作为最终元素的模块路径。例如,example.com/m 的 v2.0.0 版本必须使用模块路径 example.com/m/v2,并且该模块中的包将使用该路径作为其导入路径前缀,如 example.com/m/v2 /子/包。以这种方式在模块路径和导入路径中包含主版本号称为“语义导入版本控制”。来源这就像更新我的文件的第一行一样简单go.mod,附加/v2到模块名称吗?或者我应该v2/在我的存储库中创建一个目录并将所有文件移动到那里吗?
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

如何移动到版本 2 有两个选项:分支和子目录。

这两个选项使一个版本可以依赖另一个版本。例如,当您实施版本 2 时,您可以更新版本 1 以依赖于版本 2(但保持相同的 v1 API)。然后,您只需要为您的库实现一种逻辑。根据项目类型、您要提供的支持以及它需要的修复,这可能适合您也可能不适合您。

分支机构

master: A -> B (v1.0.0) -> D (v1.0.1)
                         \
v2:                       -> C (v2.0.0)

在这种情况下:

  1. 你在分支上开始你的项目master

  2. 做一些提交(AB),

  3. 标签v1.0.0

  4. 您决定进行重大更改。因此,您创建了一个新分支 ( git checkout -b v2) 并进行了重大更改。您的 go.mod 现在必须更新,以便模块名称以/v2(它本质上是一个新模块!)结尾。

  5. 您决定修复 中的错误v1,因此您返回该分支,进行新提交并标记新v1版本。

当用户需要您的模块的特定版本时,go将在两个分支中查找哪个提供了正确的模块。

子目录

不想在分支上开发怎么办?您可以为每个主要版本创建一个子目录。版本 1 位于顶层,然后新版本移至子目录:

go.mod (module example.com/foo)

foo.go

v2/

  go.mod (module example.com/foo/v2)

  foo.go

当您使用新版本标记此 repo 时,v1将使用顶级版本。v2标签将使用v2子目录。


查看完整回答
反对 回复 2023-05-08
?
ITMISS

TA贡献1871条经验 获得超8个赞

来自模块 wiki 的发布模块(v2 或更高版本)部分:

有两种可供选择的机制来发布 v2 或更高版本的模块。请注意,使用这两种技术,当模块作者推送新标签时,新模块版本可供消费者使用。使用创建发布的示例v3.0.0,两个选项是:

  1. 主要分支:更新文件以在指令中的模块路径末尾go.mod包含一个(例如,)。更新模块中的 import 语句以也使用(eg, )。用 标记发布。/v3modulemodule github.com/my/module/v3/v3import "github.com/my/module/v3/mypkg"v3.0.0

  • Go 版本 1.9.7+、1.10.3+ 和 1.11+ 能够正确使用和构建使用这种方法创建的 v2+ 模块,而无需更新尚未选择加入模块的消费者代码(如“语义导入版本控制” 部分)。

  • 注意:不需要创建新分支。例如,如果您之前已经在 master 上发布,并且更愿意在 master 上标记 v3.0.0,这也是一个可行的选择。[...]

[...]

  1. 主要子目录:创建一个新的v3子目录(例如,my/module/v3)并go.mod在该子目录中放置一个新文件。模块路径必须以/v3. 将代码复制或移动到 v3子目录中。更新模块中的 import 语句以也使用/v3(eg, import "github.com/my/module/v3/mypkg")。用 标记发布v3.0.0

但是,该部分中还有其他值得回顾的详细信息。

查看完整回答
反对 回复 2023-05-08
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信