【问题标题】:How are versions of a sub module managed?如何管理子模块的版本?
【发布时间】:2020-06-21 08:52:44
【问题描述】:

如果 Go 存储库在其根目录和子文件夹中有一个 go.mod 文件,那么子模块的版本是如何发布的?

例如,我的团队一直在使用 Vault 开发我们的内部 cli 工具。 我们最终使用了:

github.com/hashicorp/vault/api

github.com/hashicorp/vault/commands github.com/hashicorp/vault

我正在尝试将 Vault/api 更新到最新版本 1.3.3:

github.com/hashicorp/vault v1.3.3
github.com/hashicorp/vault/api v1.3.3

问题是我明白了:

go: github.com/hashicorp/vault/api@v1.3.3: reading github.com/hashicorp/vault/api/api/go.mod at revision api/v1.3.3: unknown revision api/v1.3.3

我认为是这个根模块和一个冲突引起的。

【问题讨论】:

  • Golang 嵌套模块是可能的,但您的问题是关于 Vault 模块的特定问题。请重命名以反映问题的实际性质
  • 你可以有子模块,问题是你导入的包没有,你把它当作它一样对待。您的go.mod 引用了modules(即github.com/hashicorp/vault),但一个模块可以包含许多(即github.com/hashicorp/vault/apigithub.com/hashicorp/vault/commands 等)。
  • @Adrian: vault/api 是一个子模块,而不仅仅是vault 中的一个包。 Vault 具有相当复杂的模块结构,其中包含多个单独版本的子模块
  • @EliBendersky 我知道这个例子是与 Vault 相关的,我对围绕根 go.mod 和子模块 go.mod 的一般原则更感兴趣,我将把这个问题改写得更清楚跨度>
  • @EliBendersky 我已经改变了问题,这更有意义吗?

标签: go hashicorp-vault


【解决方案1】:

子模块的版本不一定与父模块的版本同步。它们应该被视为完全独立的模块,恰好位于相同的存储库/目录结构中。

查看https://github.com/hashicorp/vault/releases 获取官方版本/标签——Go 支持分层 Git 标签来标记子模块的版本。例如,虽然截至今​​天 vault 的最新版本本身是 1.3.3,但我只在 v1.0.4 找到 vault/api(这是带有 api/v1.0.4 的最新标签)

只需发送go get 即可获取其最新版本。最初导入时,您实际上不必在 go.mod 中指定版本 - go 工具会为您找到最新版本。

【讨论】:

  • 您好,感谢您的回答,我在写(我自己的)对stackoverflow.com/questions/64701064/… 的回答后遇到了它,我可以要求参考有关分层标签的文档/规范吗?我没有找到这样的,尽管存在许多暗示。谢谢!
  • @agronskiy:如果你能在某个地方找到它,它可能会在这里:github.com/golang/go/wiki/Modules
  • 去看看!
  • 今天我偶然发现了这个分层 git 标签的东西。这个功能有名字吗?我在 go 模块参考中找不到它。有人可以指出我的文档吗?
【解决方案2】:

Go 模块不过是 Go 包(文件夹)的集合。属于一个包的源文件应该放在它们自己的单独文件夹中。 Go 中的约定是将此文件夹命名为与包相同的名称。

每当您在任何子文件夹下运行 go get 注释时,它都会更新到当前目录并且任何父目录都有一个 go.mod。

【讨论】:

    【解决方案3】:

    作为上述答案的补充,您可以使用go list 命令查看当前可用的模块版本:

    go list -m -versions github.com/hashicorp/vault/api
    github.com/hashicorp/vault/api v1.0.1 v1.0.2 v1.0.3 v1.0.4 v1.1.0
    

    或使用 -u 标志查看您可以升级到哪个(最新)版本(如果有):

    go list -m -u github.com/hashicorp/vault/api
    github.com/hashicorp/vault/api v1.0.3 [v1.1.0]
    

    v1.0.3 是您当前的版本,[v1.1.0] 是最新的可能版本。

    go list docs

    【讨论】:

      【解决方案4】:

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

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

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

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

      在这里定义:https://github.com/golang/go/wiki/Modules#publishing-a-release

      【讨论】:

        猜你喜欢
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2018-01-14
        • 1970-01-01
        • 2015-07-27
        • 2010-10-24
        • 2017-01-05
        相关资源
        最近更新 更多