如何管理子模块的版本?

How are versions of a sub module managed?

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

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

github.com/hashicorp/vault/api <-- 有一个 go.mod

github.com/hashicorp/vault/commands <-- 没有 go.mod 所以继承自 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

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

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

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

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

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

每当您 运行 在任何子文件夹下获取评论时,它都会更新到当前目录并且任何父目录都有 go.mod.

作为上述答案的补充,您可以使用 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

A new module version may be published by pushing a tag to the repository that contains the module source code. The tag is formed by concatenating two strings: a prefix and a version.

The version is the semantic import version for the release. It should be chosen by following the rules of semantic import versioning.

The prefix indicates where a module is defined within a repository. If the module is defined at the root of the repository, the prefix is empty, and the tag is just the version. However, in multi-module repositories, the prefix distinguishes versions for different modules. The prefix is the directory within the repository where the module is defined. If the repository follows the major subdirectory pattern described above, the prefix does not include the major version suffix.

For example, suppose we have a module example.com/repo/sub/v2, and we want to publish version v2.1.6. The repository root corresponds to example.com/repo, and the module is defined in sub/v2/go.mod within the repository. The prefix for this module is sub/. The full tag for this release should be sub/v2.1.6.

此处定义:https://github.com/golang/go/wiki/Modules#publishing-a-release