原文地址:https://bbs.huaweicloud.com/blogs/441056
本文翻译自:https://go.dev/doc/modules/managing-source
当你在开发一个用于发布给其他人使用的模块时,可以通过遵循该主题中描述的仓库约定来确保您的模块更易于其他开发人员使用。
该模块描述了在管理模块仓库时可能采取的操作。关于在不同版本之间修订时要执行的工作流程步骤,请参阅模块发布和版本控制工作流 。
这里描述的一些约定在模块中是必须的,而另外的一些则是最佳实践。本文假设您熟悉 管理依赖 中描述的基本模块的使用实践。
Go 支持使用如下仓库来发布模块:Git,Subversion,Mercurial,Bazaar以及Fossil。
有关模块开发的概述,请参阅 开发和发布模块 。
1. Go 工具是如何发现您发布的模块的?
在 Go 语言发布模块和检索代码的去中心化系统中,您可以发布您的模块,同时将其代码保留在仓库中。Go工具依赖于命名规则,这些规则具有表示模块名称和版本号的仓库路径和标签。当您的仓库遵循这些要求时,您的模块代码可以被诸如 go get 命令 这样的 Go 工具从您的代码仓库中下载下来。
当一个开发者使用 go get
命令来获取其需要导入的包的源码,该命令将会执行如下工作:
- 从 Go 源代码的
import
语句,go get
命令标识包路径中俄的模块路径。 - 使用从模块派生的 URL,命令将通过其定位到位于模块代理服务器或其源码仓库中的模块代码。
- 通过将模块的版本号与代码仓库的 Tag 进行匹配来查找要下载模块的版本的源,以发现代码仓库中的代码。如果还不知道要使用的版本号时,
go get
命令将使用最新的 release 版本。 - 检索模块源代码,并将其下载到开发者的本地模块缓存。
2. 在代码仓库中组织代码
您可以通过下方描述的方式来保持维护的简单性以及提升开发者的使用体验。将模块代码放入代码仓库通常与其他代码一样简单。
下方的关系图说明了具有两个包的简单模块的源代码层次结构:
您的初始化提交应当包含下方表格中列出的文件:
文件 | 说明 |
---|---|
LICENSE |
模块的协议 |
go.mod |
该模块的描述,包括其模块路径(实际上也是它的名字)以及它的依赖。更多信息,请参阅 go.mod 参考 。 模块路径将在 module 指令中给出,例如: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
3. 选择代码仓范围
当代码的版本应当独立于其他模块中的代码时,您可以发布模块中的代码。
3.1. 一个代码仓提供一个模块
您可以维护一个包含一个模块的代码仓。在这种模式下,您应当将您的 go.mod
文件置于代码仓的根目录中,子目录中包含了 Go 源代码。
这是最简单的方法,是您的模块更容易管理。它可以帮助您避免在模块版本号前面加上目录路径。
3.2. 在单个仓库中包含多个模块
您可以在单个仓库中发布多个模块。例如,您可能在一个代码仓中拥有由多个模块组成的代码,但希望分别对这些模块进行版本控制。
在每一个模块的根目录中都必须拥有其自己的 go.mod
文件。
在子目录中的模块代码会更改发布模块时必须使用的版本标记的形式。您必须在标记的版本号部分前面加上作为模块根的目录名称。关于版本号的更多信息,请参阅 模块版本号 。
例如,对于下面的模块 example.com/mymodules/module1
,版本 1.2.3
将包含如下内容:
- 模块路径:
example.com/mymodules/module1
- 版本标签:
module/v1.2.3
- 用户导入的包路径:
example.com/mymodules/module1/package1
- 用户 required 指令中给出的模块路径:
example.com/mymodules/module1 module1/v1.2.3