管理模块源

当您开发要发布以供其他人使用的模块时,您可以通过遵循本主题中描述的存储库约定来帮助确保其他开发人员更容易使用您的模块.

本主题描述了您在管理模块存储库时可能采取的操作。有关在版本之间进行修订时您将采取的工作流步骤顺序的信息,请参阅模块发布和版本控制工作流.

此处描述的一些约定在模块中是必需的,而另一些则是最佳实践。本内容假设您熟悉管理依赖项中描述的基本模块使用实践.

Go 支持以下用于发布模块的存储库: Git, Subversion, Mercurial, Bazaar, 和 Fossil.

有关模块开发的概述,请参阅开发和发布模块

Go 工具如何找到你发布的模块

在 Go 用于发布模块和检索其代码的去中心化系统中,您可以发布您的模块,同时将代码留在您的存储库中。Go 工具依赖于命名规则,这些规则具有指示模块名称和版本号的存储库路径和存储库标记。当您的存储库遵循这些要求时,您的模块代码可以通过 Go 工具(例如go get 命令 )从您的存储库下载。

当开发人员使用 go get命令获取其代码导入的包的源代码时,该命令执行以下操作:

  1. 从 Go 源代码中的 import 语句中,go get 标识包路径中的模块路径。
  2. 使用从模块路径派生的 URL,该命令在模块代理服务器上或直接在其存储库中定位模块源。
  3. 通过将模块的版本号与存储库标记匹配以发现存储库中的代码,查找要下载的模块版本的源代码。当尚不知道要使用的版本号时,go get查找最新的发布版本。
  4. 检索模块源并将其下载到开发人员的本地模块缓存中.

在存储库中组织代码

您可以按照此处描述的约定,使维护保持简单,并改善开发人员对模块的体验。将模块代码放入存储库通常与使用其他代码一样简单。

下图说明了具有两个包的简单模块的源层次结构。

Diagram illustrating a module source code hierarchy

您的初始提交应包括下表中列出的文件:

文件 描述
LICENSE 模块的许可证.
go.mod

描述模块,包括它的模块路径(实际上是它的名称)和它的依赖关系。有关更多信息,请参阅 go.mod 参考

模块路径将在模块指令中给出,例如:

module example.com/mymodule

有关选择模块路径的更多信息,请参阅 管理依赖项

虽然您可以编辑 go.mod 文件,但您会发现通过 go 命令进行更改更可靠。

go.sum

包含表示模块依赖项的加密哈希。Go 工具使用这些哈希来验证下载的模块,试图确认下载的模块是真实的。如果此确认失败,Go 将显示安全错误

当没有依赖项时,该文件将为空或不存在。您不应该编辑此文件,除非使用 go mod tidy 命令,该命令会删除不需要的条目.

包目录和 .go 源码. 包含模块中的 Go 包和源代码的目录和 .go 文件。

从命令行,您可以创建一个空存储库,添加将成为初始提交的一部分的文件,并使用消息提交。下面是一个使用 git 的例子:

$ git init
$ git add --all
$ git commit -m "mycode: initial commit"
$ git push

选择存储库范围

当代码应独立于其他模块中的代码进行版本控制时,可以在模块中发布代码。

将存储库设计为在其根目录中托管单个模块将有助于简化维护,尤其是随着时间的推移,当您发布新的次要版本和补丁版本、分支到新的主要版本等时。但是,如果您需要require它,您可以改为在单个存储库中维护一组模块。

每个存储库一个模块

您可以维护一个存储库,其中包含单个模块的源代码。在此模型中,您将 go.mod 文件放在存储库根目录下,其下有包含 Go 源代码的包子目录.

这是最简单的方法,随着时间的推移,您的模块可能更易于管理。它可以帮助您避免在模块版本号前面加上目录路径。

Diagram illustrating a single module's source in its repository

单个存储库中多个模块

您可以从单个存储库发布多个模块。例如,您可能在一个包含多个模块的存储库中拥有代码,但希望分别对这些模块进行版本控制。

作为模块根目录的每个子目录都必须有自己的 go.mod 文件.

在子目录中获取模块代码会更改发布模块时必须使用的版本标记的形式。您必须在标记的版本号部分前面加上作为模块根目录的子目录的名称。有关版本号的更多信息,请参阅模块版本编号.

例如,对于下面的模块 example.com/mymodules/module1,对于 v1.2.3 版本,您将具有以下内容:

Diagram illustrating two modules in a single repository