第 8 章 使用 GitHub Packages 管理依赖关系

使用软件包注册表来管理依赖项应该是一个理所当然的选择。如果你写的是 .NET,使用 NuGet;如果是 JavaScript,可能是 npm;如果是 Java,使用 Maven 或 Gradle。然而,我遇到过许多团队仍然使用文件系统或 Git 子模块来在多个代码库中重用代码文件,或者他们将程序集存储在源代码管理中。转向使用具有语义版本控制的包是简单且便宜的,它能提升共享代码的质量和可发现性。

在本章中,我将向你展示如何使用 GitHub Packages 来管理你的内部依赖,就像你管理软件供应链一样。主要内容包括:

  • GitHub Packages

  • 在 Actions 中使用 npm 包

  • 使用 Docker 与 Packages

  • Apache Maven、Gradle、NuGet 和 RubyGems 包

语义版本控制(Semantic Versioning)

语义版本控制是一种用于指定软件版本号的正式约定。它由不同部分组成,每个部分有不同的含义。语义版本号的示例包括 1.0.0 或 1.5.99-beta。其格式如下:

<major>.<minor>.<patch>-<pre>

  • 主要版本(Major version):一个数字标识符,当版本不向后兼容并且存在破坏性更改时,会增加该版本号。更新到新主版本时必须谨慎!主版本号为零时表示初始开发阶段。

  • 次要版本(Minor version):一个数字标识符,当添加了新功能但版本与先前版本向后兼容时,会增加该版本号。如果需要新功能,可以更新而不会破坏任何东西。

  • 修订版本(Patch):一个数字标识符,当发布向后兼容的 bug 修复时,会增加该版本号。新修订版本应始终安装。

  • 预版本(Pre-version):一个附加的文本标识符,通过短横线连接。标识符只能使用 ASCII 字母数字字符和短横线([0-9A-Za-z-])。文本越长,预版本越小(即 -alpha < -beta < -rc)。预发布版本总是小于正常版本(1.0.0-alpha < 1.0.0)。

完整的规范可以参见 https://semver.org/。

使用软件包并不意味着你自动使用了松耦合的架构。软件包在大多数情况下仍然是硬依赖。是否能真正解耦发布周期,取决于你如何使用这些软件包。