开发和发布模块
你可以将相关的包收集到模块中,然后发布这些模块供其他开发者使用。本主题概述了模块的开发和发布。
为了支持模块的开发、发布和使用,你需要使用
- 一个工作流程,通过该工作流程,你开发和发布模块,并随着时间的推移用新版本进行修订。请参阅开发和发布模块的工作流程。
- 设计实践,帮助模块用户理解模块并以稳定的方式升级到新版本。请参阅设计和开发。
- 一个去中心化的发布系统,用于发布模块并检索其代码。你将模块从自己的仓库中提供给其他开发者使用,并以版本号发布。请参阅去中心化发布。
- 一个包搜索引擎和文档浏览器(pkg.go.dev),开发者可以在其中找到你的模块。请参阅包发现。
- 一个模块版本号约定,用于向使用你的模块的开发者传达稳定性和向后兼容性的预期。请参阅版本控制。
- Go 工具,使其他开发者更容易管理依赖项,包括获取模块源、升级等。请参阅管理依赖项。
另请参阅
- 如果你只是对使用他人开发的包感兴趣,那么这不是适合你的主题。相反,请参阅管理依赖项。
- 有关包含一些模块开发基础知识的教程,请参阅教程:创建 Go 模块。
开发和发布模块的工作流程
当你希望将模块发布给其他人时,你需要采用一些约定来简化这些模块的使用。
以下高级步骤在模块发布和版本控制工作流程中进行了更详细的描述。
- 设计和编写模块将包含的包。
- 使用确保通过 Go 工具向他人提供代码的约定,将代码提交到你的仓库。
- 发布模块,使其可被开发者发现。
- 随着时间的推移,使用版本号约定修订模块,该约定表示每个版本的稳定性和向后兼容性。
设计和开发
如果模块中的函数和包形成一个连贯的整体,开发者会更容易找到和使用你的模块。在设计模块的公共 API 时,请尽量使其功能集中且独立。
此外,在设计和开发模块时考虑向后兼容性有助于其用户升级,同时最大程度地减少对其自身代码的改动。你可以在代码中使用某些技术来避免发布破坏向后兼容性的版本。有关这些技术的更多信息,请参阅 Go 博客上的保持模块兼容。
在发布模块之前,你可以使用 replace 指令在本地文件系统上引用它。这使得在模块仍在开发中时,更容易编写调用模块中函数的客户端代码。有关更多信息,请参阅模块发布和版本控制工作流程中的“针对未发布的模块进行编码”。
去中心化发布
在 Go 中,你通过在仓库中标记模块代码来发布模块,使其可供其他开发者使用。你不需要将模块推送到中央服务,因为 Go 工具可以直接从你的仓库(使用模块路径定位,模块路径是省略方案的 URL)或从代理服务器下载你的模块。
在他们的代码中导入你的包后,开发者使用 Go 工具(包括 go get
命令)下载你的模块代码进行编译。为了支持这种模型,你遵循约定和最佳实践,使 Go 工具(代表其他开发者)能够从你的仓库中检索你的模块源。例如,Go 工具使用你指定的模块路径,以及你用于标记模块以供发布时使用的模块版本号,来定位和下载供其用户使用的模块。
有关源和发布约定以及最佳实践的更多信息,请参阅管理模块源。
有关发布模块的分步说明,请参阅发布模块。
包发现
在你发布模块并且有人使用 Go 工具获取它之后,它将在 Go 包发现网站pkg.go.dev上可见。在那里,开发者可以搜索该网站以找到它并阅读其文档。
要开始使用模块,开发者导入模块中的包,然后运行 go get
命令以下载其源代码进行编译。
有关开发者如何查找和使用模块的更多信息,请参阅管理依赖项。
版本控制
随着时间的推移,当你修订和改进模块时,你分配版本号(基于语义版本控制模型),旨在表示每个版本的稳定性和向后兼容性。这有助于使用你的模块的开发者确定模块何时稳定以及升级是否可能包含行为上的重大更改。你通过在仓库中用版本号标记模块源来指示模块的版本号。
有关开发主要版本更新的更多信息,请参阅开发主要版本更新。
有关如何将语义版本控制模型用于 Go 模块的更多信息,请参阅模块版本号。