【问题标题】:Golang: separate versioning of multiple modulesGolang:多个模块的单独版本控制
【发布时间】:2021-02-18 09:17:14
【问题描述】:

想象一下,我有一个 repo github.com/user/golang-examples,并且我准备单独对其中的每个示例模块进行版本控制:

guthub.com/user/golang-examples
  /modA
    /go.mod
    /pkgA1
    /pkgA2

  /modB
    /go.mod
    /pkgB1
    /pkgB2

(我知道成语是“一个 repo - 一个模块”,但也有多模块项目的用例,所以这不是讨论的主题)

同时,语义 git 标记(v1.0.0v2.0.0 等)发生在 repo 级别,而不是它的 子文件夹。这使得无法单独标记模块,例如

  1. 首先,modA 在主要版本的开发中超过了modB,标签v2.0.0 被推送到repo 级别,意图是版本modA
  2. 后来,当想升级modB到v2时,不能第二次将相同的v2.0.0 git标签推送到版本modB

如何根据 golang 的版本控制范式完成这项任务?同样,这是关于多模块项目。将模块拆分为 repos 的明显解决方案在这里有点不利,因为需要顶级 repo 的总体“示例”语义。

谢谢!

【问题讨论】:

    标签: semantic-versioning go-modules


    【解决方案1】:

    好的,经过继续搜索,我找到了这个资源:https://github.com/go-modules-by-example/index/blob/master/009_submodules/README.md

    应用于我的情况,答案是使用:

    • 对于模块modA,使用modA/vX.Y.Z 形式的标签(使用语义版本控制)
    • 对于模块modB,使用modB/vX.Y.Z 形式的标签

    对于上下文,来自上述 lint 的引用:

    official modules proposal 预测大多数项目将遵循最简单的方法,即每个存储库使用单个 Go 模块,这通常意味着在存储库的根目录中创建一个 go.mod 文件。

    由于某种原因,我仍然找不到正确的文档/规范参考。

    【讨论】:

      【解决方案2】:

      这是golang标签子模块的文档:
      https://github.com/golang/go/wiki/Modules#publishing-a-release

      可以通过将标签推送到包含模块源代码的存储库来发布新的模块版本。标签由两个字符串连接而成:前缀和版本。

      版本是发布的语义导入版本。应遵循语义导入版本控制规则进行选择。

      前缀表示模块在存储库中的定义位置。如果模块定义在存储库的根目录,则前缀为空,标签就是版本。但是,在多模块存储库中,前缀区分不同模块的版本。前缀是存储库中定义模块的目录。如果存储库遵循上述主要子目录模式,则前缀不包括主要版本后缀。

      例如,假设我们有一个模块 example.com/repo/sub/v2,并且我们想要发布版本 v2.1.6。存储库根对应于 example.com/repo,模块定义在存储库内的 sub/v2/go.mod 中。该模块的前缀是 sub/。此版本的完整标记应为 sub/v2.1.6。

      【讨论】:

        猜你喜欢
        • 2021-10-12
        • 2012-05-14
        • 2022-11-23
        • 1970-01-01
        • 2020-02-10
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多