版本编号
本文介绍 Minecraft 和 NeoForge 的版本编号方式,并为 Mod 的版本管理提供一些建议。本文对应 Minecraft 1.21.1 文档快照,其中关于版本惯例和示例 Mod 版本的表述以原文撰写时为准。
Minecraft
Minecraft 使用语义化版本编号。语义化版本(简称 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 的玩笑,因此这一惯例不太可能改变。
快照版
快照版不采用标准的 semver 格式,而是使用 YYwWWa:YY 是年份的最后两位(例如 23),WW 是当年的周数(例如 01)。例如,23w01a 是 2023 年第一周发布的快照。
后缀 a 用于区分同一周内发布的多个快照。如果发布第二个快照,名称就可能是 23w01b。Mojang 过去偶尔使用过这种方式。快照也可能使用其他后缀,例如 20w14infinite,即 2020 年无限维度愚人节版本。
预发布版与发布候选版
快照开发周期接近结束时,Mojang 会开始发布预发布版。预发布版被视为该版本功能已完整,后续工作主要是修复错误。编号使用目标版本的 semver 编号,并添加 -preX 后缀。例如,1.20.2 的首个预发布版名为 1.20.2-pre1。通常会有多个预发布版,后续依次使用 -pre2、-pre3 等后缀。
预发布周期完成后,Mojang 会发布第一个发布候选版,后缀为 -rc1,例如 1.20.2-rc1。目标是:如果没有发现新的问题,就可以直接将它作为正式版发布。如果发现意外错误,也可能像预发布版一样继续发布 -rc2、-rc3 等版本。
NeoForge
NeoForge 使用经过调整的 semver:主版本号对应 Minecraft 的次版本号,次版本号对应 Minecraft 的修订号,修订号才是 NeoForge 自身的构建序号。例如,NeoForge 20.2.59 是适用于 Minecraft 1.20.2 的第 60 个版本(编号从 0 开始)。Minecraft 编号开头的 1 被省略,原文理由见上文。
NeoForge 的一些配置还使用 Maven 版本范围,例如 neoforge.mods.toml 中的 Minecraft 和 NeoForge 版本范围。Maven 版本规则与 semver 大体兼容,但并不完全相同,例如不会按 Minecraft 的预期方式理解 pre 标签。
Mod
版本管理没有适用于所有项目的最佳方案。开发方式、项目规模等因素都会影响选择,有时也会组合多种编号方式。本节通过实际例子介绍几种常见方案。
通常,Mod 的文件名采用 modid-<version>.jar。例如,Mod ID 为 examplemod、版本为 1.2.3 时,文件名就是 examplemod-1.2.3.jar。
提示 版本编号方式是建议,并非强制规则。何时提升版本号、提升哪一部分,尤其取决于项目自身的约定。你也可以采用其他版本管理方式。
语义化版本
语义化版本(semver)由 major.minor.patch 三部分组成。代码库发生重大变更时提升主版本号,这通常意味着重要的新功能和错误修复;引入较小功能时提升次版本号;更新仅包含错误修复时提升修订号。
一般约定 0.x.x 表示开发中的版本,第一次完整发布时应将版本提升到 1.0.0。
实际项目经常不会严格遵守“次版本号用于功能、修订号用于修复”的规则。Minecraft 就是一个常见例子:它用次版本号承载主要功能,用修订号承载较小功能,并在快照中修复错误,见上文。
这些数字的大小取决于 Mod 的更新频率。例如,原文撰写时 Supplementaries 的版本是 2.6.31。出现三位甚至四位的数字也完全可能,尤其是修订号。
“精简”和“扩展”的 semver
有时可以看到只有两个数字的 semver,可称为“精简 semver”或“两段式 semver”,格式为 major.minor。只添加少量简单内容的小型 Mod 经常使用这种方式。这类项目除了适配 Minecraft 新版本外,很少需要更新,可能长期保持 1.0。
“扩展 semver”或“四段式 semver”包含四个数字,例如 1.0.0.0。具体格式可能是 major.api.minor.patch、major.minor.patch.hotfix,也可能另有约定,并没有统一标准。
在 major.api.minor.patch 方案中,主版本号与 API 版本号分离,因此功能主版本与 API 版本可以独立提升。这常见于向其他 Mod 开发者提供 API 的项目。例如,原文撰写时 Mekanism 使用版本号 10.4.5.19。
major.minor.patch.hotfix 则进一步拆分了修订级别。Create 采用这种思路,原文撰写时的版本为 0.5.1f。注意,Create 使用字母表示热修复级别,而非第四个数字,以保持与常规 semver 的兼容性。
说明 精简 semver、扩展 semver、两段式 semver、四段式 semver 都不是正式术语,也不是标准格式。
Alpha、Beta 与正式版
与 Minecraft 类似,Mod 开发也经常采用软件工程中常见的 alpha、beta、release 阶段。alpha 表示不稳定或实验版本,有时也称为 experimental 或 snapshot;beta 表示相对稳定的测试版本;release 表示稳定版本,有时直接使用 stable。
部分 Mod 通过主版本号表示所适配 Minecraft 版本的变化。例如 JEI 用 13.x.x.x 对应 Minecraft 1.19.2,14.x.x.x 对应 1.19.4,15.x.x.x 对应 1.20.1(没有针对 1.19.3 和 1.20.0 的版本)。另一些 Mod 会在名称末尾添加阶段标签,例如原文撰写时 Minecolonies 的版本是 1.1.328-BETA。
加入 Minecraft 版本
文件名中通常会包含 Mod 所适用的 Minecraft 版本,便于最终用户辨认。它可以放在 Mod 版本之前或之后,前一种更常见。例如,适用于 Minecraft 1.20.2 的 JEI 16.0.0.28(原文撰写时的最新版本)可以命名为 jei-1.20.2-16.0.0.28 或 jei-16.0.0.28-1.20.2。
加入 Mod 加载器
NeoForge 并非唯一的 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 都可以。对于其他加载器,则将 neoforge 替换为 forge、fabric、quilt 或项目所支持的其他加载器名称。
Maven 相关注意事项
用于托管依赖的 Maven,其版本编号规则在一些细节上与 semver 不同,虽然整体仍然采用 major.minor.patch 模式。NeoForge 的部分配置使用相关的 Maven 版本范围(MVR),见上文。选择版本编号方式时,应确认它与 MVR 兼容,否则其他 Mod 将无法正确声明对你的 Mod 特定版本的依赖。
来源: NeoForged/Documentation(1.21.1)。中文翻译依据提交
4a680cdd4d15。