☰
sebastian/version 使用指南:为 Git 托管的 PHP 项目自动生成版本号
2026/10/15 17:46:11 网站建设 项目流程
  • 开发工具

【免费下载链接】version

Library that helps with managing the version number of Git-hosted PHP projects

项目地址:https://gitcode.com/gh_mirrors/ver/version
点击查看免费下载

sebastian/version是一个专注于「版本号管理」的轻量 PHP 库:它由 PHPUnit 之父 Sebastian Bergmann 开发并长期维护,核心能力是在 Git 托管环境下,根据最新发布版本与当前代码仓库的git describe --tags信息,自动生成形如1.0.0-17-g00f3408的精确版本字符串。本文以仓库 README.md 为主线,结合 src/Version.php 源码实现,完整讲解其安装、使用、四种版本生成分支的底层逻辑,以及接入 CI、发布新版本时的实操要点。

一、这个库解决什么问题

在 PHP 项目的日常开发与发布流程中,你经常需要回答这样一个问题:当前这份代码到底处于哪个版本?

  • 从 tag 出发,1.0.0标签之后又提交了 17 个 commit,当前 HEAD 的短哈希是g00f3408;
  • 代码可能来自任意子目录,也可能被复制到非 Git 环境中;
  • 发布系列(release series)尚未打任何 tag 时,版本号应该如何表示?

sebastian/version把上述逻辑收敛为两个输入和一个输出:你只需告诉它「最近一次发布的版本号」和「源码所在目录」,它就能借助 Git 自身的描述能力,返回一条语义明确、可直接用于包元数据、调试信息或错误报告的版本字符串。从源码结构看,整个库对外只暴露一个SebastianBergmann\Version类(src/Version.php),设计极其克制,无任何外部运行时依赖。

二、安装:Composer 引入

在 composer.json 中可以看到,该库对 PHP 的最低要求为>=8.2,自动加载采用classmap扫描src/目录,因此安装后无需额外配置即可使用。

作为项目的常规依赖安装:

composer require sebastian/version

如果只是开发阶段需要——例如仅用于在测试套件中打印版本信息、或为 CLI 工具生成--version输出——建议作为开发期依赖安装,避免把它带入生产环境:

composer require --dev sebastian/version

两种方式的差异仅在于依赖是否写入require还是require-dev;运行时 API 完全相同。

三、基本用法:两个参数,一个方法

SebastianBergmann\Version的构造函数接收两个参数:

参数类型含义
$releasestring最近一次发布的版本号,格式为X.Y.Z(如1.0.0);如果该分支/发布系列尚未发布过任何版本,则传发布系列名X.Y(如1.0)
$pathstring项目源码所在目录或其任意子目录的路径,通常直接传__DIR__即可

除构造函数外,类只公开一个方法asString(),返回最终生成的版本字符串。README 给出了一个最简示例:

<?php declare(strict_types=1); use SebastianBergmann\Version; $version = new Version('1.0.0', __DIR__); var_dump($version->asString());

当__DIR__位于一个打有1.0.0标签、此后又积累了 17 个提交的 Git 仓库中时,输出为:

string(18) "1.0.0-17-g00f3408"

这段输出正是git describe --tags的标准格式:<最近标签>-<标签后提交数>-g<短提交哈希>。其中1.0.0是最近标签,17表示标签之后的提交数量,g00f3408中的g是 describe 的固定前缀、00f3408为当前提交的短哈希。

四、源码视角:版本号是如何算出来的

asString()本身只返回构造时缓存好的字符串;真正的计算发生在私有方法generate()中(src/Version.php)。理解它的两个关键分支,就能完全掌握该库的行为。

第一步:判断$release的格式。源码用substr_count($release, '.') + 1 === 3判断传入的版本号是否为X.Y.Z三段式。若是,则临时版本值直接取$release;否则(即X.Y系列名)临时版本值为$release . '-dev'。

第二步:探测 Git 仓库。getGitInformation()(src/Version.php)先检查$path下是否存在.git目录(使用DIRECTORY_SEPARATOR拼接以保证跨平台),随后以$path为工作目录执行git describe --tags。需要特别注意的是,该命令以数组形式传给proc_open而非拼成 shell 字符串,从而避免启动 shell 进程——这正是 ChangeLog.md 中 5.0.2 版本(2024-10-09)的变更点。若进程启动失败、返回码非 0(例如仓库没有任何 tag),函数返回false。

第三步:四种组合决定最终输出,详见下一节。

Version类本身被声明为final readonly(src/Version.php),意味着实例一旦构造便不可变、也不可继承,asString()每次调用都返回构造时确定的同一字符串——这保证了在对象生命周期内版本号始终一致,也契合只读值对象的工程实践。

五、asString() 的四种行为分支(核心规则)

README 将asString()的行为归纳为四类,它们由「$path是否位于 Git 仓库」与「$release是X.Y.Z还是X.Y」两个维度组合而成:

场景$release格式返回结果
非 Git 仓库X.Y.Z原样返回$release(如1.0.0)
非 Git 仓库X.Y返回$release加-dev后缀(如1.0-dev)
Git 仓库X.Y.Z直接返回git describe --tags的输出(如1.0.0-17-g00f3408)
Git 仓库X.Y返回以X.Y开头、以git describe --tags信息结尾的字符串

四种规则在源码generate()中均有对应实现:非 Git 场景直接返回第一步算出的临时版本值;Git 且为X.Y.Z场景原样返回 describe 输出;Git 且为X.Y场景则对 describe 输出按-切分后取其末段(即g<短哈希>部分),拼接为X.Y-g<短哈希>形式。这样的设计保证了:

  • 发布后稳定:打 tag 的正式发布场景,版本号等于 tag 本身,干净可控;
  • 开发期可追踪:未发布的代码总是带-dev或-g<哈希>后缀,一眼即可识别是否来自已发布版本,且能定位到具体提交。

六、发布流程要点:更新构造参数

README 明确提醒:每次准备新发布时,传给构造函数的第一参数必须同步更新。这是因为库本身不会去解析 tag 列表——$release是它判断当前分支「处于哪个版本上下文」的锚点。若发布1.0.0后仍传入旧的0.9,describe 信息与发布系列名将失去对应关系。

实践中可以配合仓库自带的发布辅助脚本 build/scripts/extract-release-notes.php 建立发布流水线:该脚本以 tag 名为参数,从 ChangeLog.md 中提取对应的更新说明段落,例如:

php build/scripts/extract-release-notes.php 5.0.2

它会输出 ChangeLog 中## [5.0.2]小节的内容,供发布公告或 Release Notes 直接复用,保证「构造参数、tag、ChangeLog」三者同步更新。

七、工程实践与代码质量基线

从仓库其余配置文件可以看到该项目自身的工程化标准,这些也是接入方可以参考的实践:

  • 静态分析:phpstan.neon 配置为level: 10(最高严格级别)作用于src/目录;ChangeLog.md 记载 5.0.1 起该项目以 PHPStan 取代 Psalm 进行静态分析;
  • 代码风格:.php-cs-fixer.dist.php 维护了一整套 PHP-CS-Fixer 规则,并在文件头强制注入项目版权注释;
  • 环境约束:依赖php >= 8.2,类使用final readonly与原生类型声明,配合declare(strict_types=1)(src/Version.php)追求类型安全;
  • 发布节奏:版本演进记录在 ChangeLog.md 中——5.0.0 移除了对 PHP 8.1 的支持;4.0.0 将Version::getVersion()重命名为asString(),同时放弃 PHP 7.3/7.4/8.0;5.0.2 改为以数组命令执行git调用以规避 shell 进程。若你正在升级旧版本代码,需留意getVersion()已不存在。

八、总结

sebastian/version以极小的 API 面(一个类、一个方法)覆盖了「Git 托管 PHP 项目版本号管理」这一高频需求:X.Y.Z精确版本与git describe --tags输出在 Git 环境中自动衔接,非 Git 环境下退化为干净的版本字符串或-dev后缀,整个判断矩阵清晰且可预测。配合其源码实现,你可以轻松将它接入 Composer 自动加载的任意 PHP 项目中——无论是为 CLI 工具提供--version,还是在测试套件里记录被测代码的确切来源,这一行new Version('1.0.0', __DIR__)->asString()都足够可靠。

  • 开发工具

【免费下载链接】version

Library that helps with managing the version number of Git-hosted PHP projects

项目地址:https://gitcode.com/gh_mirrors/ver/version
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询