版本控制
文章翻译自官方文档:
版本控制
本文将分解 Minecraft 和 NeoForge 中的版本控制方式,并给出一些关于 Mod 版本控制的建议。
Minecraft
Minecraft 使用语义化版本控制(Semantic Versioning)。语义化版本控制(简称 "semver")的格式为 major.minor.patch
。例如,Minecraft 1.20.2 的主版本号为 1,次版本号为 20,修订版本号为 2。
自 2011 年 Minecraft 1.0 发布以来,Minecraft 一直使用 1 作为主版本号。在此之前,版本控制方案经常变化,出现过像 a1.1(Alpha 1.1)、b1.7.3(Beta 1.7.3)甚至 infdev 版本,这些版本根本没有遵循明确的版本控制方案。由于主版本号 1 已经持续了十多年,并且由于 Minecraft 2 的内部笑话,普遍认为这种情况不太可能改变。
快照版(Snapshots)
快照版偏离了标准的语义化版本控制方案。它们的标签格式为 YYwWWa
,其中 YY
表示年份的最后两位数字(例如 23),WW
表示该年的第几周(例如 01)。因此,快照版 23w01a 是 2023 年第一周发布的快照版。
a
后缀用于同一周内发布两个快照版的情况(第二个快照版将被命名为类似 23w01b 的名称)。Mojang 过去偶尔使用过这种方式。替代后缀也曾用于像 20w14infinite 这样的快照版,这是 2020 年无限维度的愚人节玩笑。
预发布版和候选发布版
当快照周期接近完成时,Mojang 开始发布所谓的预发布版(Pre-releases)。预发布版被认为是该版本的功能完整版,仅专注于修复错误。它们使用语义化版本控制的版本号,后缀为 -preX
。例如,1.20.2 的第一个预发布版被命名为 1.20.2-pre1。可能会有多个预发布版,通常依次命名为 -pre2
、-pre3
等。
类似地,当预发布周期完成后,Mojang 会发布候选发布版 1(在版本号后加上 -rc1
,例如 1.20.2-rc1)。Mojang 的目标是发布一个候选发布版,如果没有进一步的错误发生,就可以发布它。然而,如果出现意外错误,则可能会有 -rc2
、-rc3
等版本,类似于预发布版。
NeoForge
NeoForge 使用了一种改进的语义化版本控制系统:主版本号是 Minecraft 的次版本号,次版本号是 Minecraft 的修订版本号,修订版本号是 NeoForge 的“实际”版本号。例如,NeoForge 20.2.59 是 Minecraft 1.20.2 的第 60 个版本(我们从 0 开始计数)。开头的 1 被省略,因为它不太可能改变,原因如上所述。
NeoForge 中的一些地方也使用 Maven 版本范围,例如 neoforge.mods.toml
文件中的 Minecraft 和 NeoForge 版本范围。这些范围大部分与语义化版本控制兼容,但并不完全兼容(例如,它不考虑预发布标签)。
Mods
没有绝对最佳的版本控制系统。不同的开发风格、项目范围等都会影响选择哪种版本控制系统。有时,版本控制系统也可以组合使用。本节试图概述一些常用的版本控制系统,并提供实际示例。
通常,Mod 的文件名格式为 modid-<version>.jar
。因此,如果我们的 Mod ID 是 examplemod
,版本是 1.2.3
,那么我们的 Mod 文件将被命名为 examplemod-1.2.3.jar
。
注意:版本控制系统是建议,而不是严格执行的规则。特别是在版本更改(“升级”)的时间和方式方面。如果您想使用不同的版本控制系统,没有人会阻止您。
语义化版本控制(Semantic Versioning)
语义化版本控制(“semver”)由三部分组成:major.minor.patch
。主版本号在代码库发生重大更改时升级,通常与主要新功能和错误修复相关。次版本号在引入次要功能时升级,修订版本号在更新仅包含错误修复时升级。
普遍认为,任何 0.x.x
版本都是开发版本,首次(完整)发布时,版本应升级为 1.0.0
。
在实践中,“次版本号用于功能,修订版本号用于错误修复”的规则经常被忽略。一个流行的例子是 Minecraft 本身,它通过次版本号引入主要功能,通过修订版本号引入次要功能,并在快照版中修复错误(见上文)。
根据 Mod 的更新频率,这些数字可以较小或较大。例如,Supplementaries 在撰写本文时版本为 2.6.31。三位数甚至四位数的版本号,尤其是在修订版本号中,是完全可能的。
“简化”和“扩展”语义化版本控制
有时,语义化版本控制可能只使用两个数字。这是一种“简化”的语义化版本控制,或“两部分”语义化版本控制。它们的版本号只有 major.minor
格式。这通常用于小型 Mod,这些 Mod 只添加了几个简单的对象,因此很少需要更新(除了 Minecraft 版本更新),通常永远保持在 1.0 版本。
“扩展”语义化版本控制,或“四部分”语义化版本控制,有四个数字(例如 1.0.0.0
)。根据 Mod 的不同,格式可以是 major.api.minor.patch
,或 major.minor.patch.hotfix
,或完全不同的格式——没有标准的方式。
对于 major.api.minor.patch
,主版本号与 API 版本号分离。这意味着主版本号(功能部分)和 API 部分可以独立升级。这通常用于暴露 API 供其他 Mod 开发者使用的 Mod。例如,Mekanism 在撰写本文时版本为 10.4.5.19。
对于 major.minor.patch.hotfix
,修订版本号被分为两部分。这是 Create Mod 使用的方法,在撰写本文时版本为 0.5.1f。请注意,Create 使用字母而不是第四个数字来表示热修复,以保持与常规语义化版本控制的兼容性。
信息:简化语义化版本控制、扩展语义化版本控制、两部分语义化版本控制和四部分语义化版本控制并不是官方术语或标准化格式。
Alpha、Beta、Release
与 Minecraft 本身一样,Mod 开发通常遵循软件工程中经典的 alpha/beta/release 阶段,其中 alpha 表示不稳定/实验性版本(有时也称为 experimental 或 snapshot),beta 表示半稳定版本,release 表示稳定版本(有时称为 stable 而不是 release)。
一些 Mod 使用主版本号来表示 Minecraft 版本的升级。一个例子是 JEI,它在 Minecraft 1.19.2 上使用 13.x.x.x,在 1.19.4 上使用 14.x.x.x,在 1.20.1 上使用 15.x.x.x(没有 1.19.3 和 1.20.0 的版本)。其他 Mod 将标签附加到 Mod 名称中,例如 Minecolonies Mod,在撰写本文时版本为 1.1.328-BETA。
包含 Minecraft 版本
在文件名中包含 Mod 所支持的 Minecraft 版本是很常见的。这使得最终用户更容易找到 Mod 所支持的 Minecraft 版本。通常,这可以在 Mod 版本之前或之后,前者比后者更常见。例如,JEI 版本 16.0.0.28(撰写本文时的最新版本)在 1.20.2 上可以命名为 jei-1.20.2-16.0.0.28
或 jei-16.0.0.28-1.20.2
。
包含 Mod 加载器
正如您可能知道的那样,NeoForge 并不是唯一的 Mod 加载器,许多 Mod 开发者在多个平台上开发。因此,需要一种方法来区分同一 Mod 同一版本但用于不同 Mod 加载器的两个文件。
通常,这是通过在名称中包含 Mod 加载器来实现的。jei-neoforge-1.20.2-16.0.0.28
、jei-1.20.2-neoforge-16.0.0.28
或 jei-1.20.2-16.0.0.28-neoforge
都是有效的方式。对于其他 Mod 加载器,neoforge
部分将被替换为 forge
、fabric
、quilt
或您可能正在与 NeoForge 一起开发的其他 Mod 加载器。
关于 Maven 的说明
Maven 是用于依赖项托管的系统,它使用的版本控制系统在某些细节上与语义化版本控制不同(尽管主要的 major.minor.patch
模式保持不变)。相关的 Maven 版本范围(MVR)系统在 NeoForge 中的一些地方使用(见上文)。在选择版本控制方案时,您应确保它与 MVR 兼容,否则 Mod 将无法依赖于您的 Mod 的特定版本!