ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ShowDoc 依赖探秘:phar-io/version 版本约束解析库的安装、原理与实战

ShowDoc 依赖探秘:phar-io/version 版本约束解析库的安装、原理与实战 ShowDoc 依赖探秘phar-io/version 版本约束解析库的安装、原理与实战【免费下载链接】showdocShowDoc is a tool greatly applicable for an IT team to share documents online一个非常适合IT团队的在线API文档、技术文档工具项目地址: https://gitcode.com/gh_mirrors/sh/showdoc导读phar-io/version 是 PHP 生态中一个专注处理版本信息与版本约束的轻量级库本仓库的 ShowDoc 项目通过 Composer 将其引入composer.lock 中锁定版本为^3.0.1作为 phpunit/phpunit 的传递依赖运行于测试链路中。本文以该库的官方文档为主线结合仓库内实际源码带你完整掌握它的安装方式、版本约束Caret/Tilde语法、与VersionConstraintParser、Version等核心类的解析与比较原理并给出可直接运行的使用示例。读完本文你将能独立在任何 PHP 项目中用它完成版本范围判断、预发布版本排序、依赖约束校验等任务。说明该库在 ShowDoc 仓库中位于 server/vendor/phar-io/version属于 Composer 管理下的第三方 vendor 代码其 README即本文主体与 src 目录内的实现即最可靠的一手资料。一、phar-io/version 是什么1.1 库的定位根据 README.md 的官方定义这是一套用于处理版本信息和版本约束Library for handling version information and constraints的 PHP 库。它的核心能力有两个解析版本号将符合语义化版本SemVer格式的字符串解析为结构化的版本对象解析并执行版本约束把^1.0、~1.1.0这类约束表达式翻译成可编程判断的规则再与具体的版本对象做匹配。1.2 在 ShowDoc 中的角色从 composer.json 可以看到ShowDoc 直接依赖phpunit/phpunit: ^9而 phpunit 又依赖phar-io/versioncomposer.lock 显示phar-io/version: ^3.2.1为 phpunit 的依赖项。因此该库属于传递依赖它的版本约束表达式在 Composer 解析 phpunit 及其上游组件版本时被真实调用。你可以通过composer why phar-io/version查看当前项目的依赖来源链。二、安装与引入2.1 标准安装命令官方文档给出的安装方式是通过 Composer 按项目本地安装# 作为项目运行期依赖安装 composer require phar-io/version # 仅作为开发期依赖安装如只为跑测试套件 composer require --dev phar-io/version第一条命令将库写入require第二条写入require-dev。文档特别强调如果只是开发阶段需要比如运行测试套件应该用--dev避免把测试工具带入生产依赖。2.2 本仓库的落地形式在 ShowDoc 仓库中该库由 Composer 自动安置于 server/vendor/phar-io/version其 composer.json 声明name:phar-io/versionlicense:BSD-3-Clauserequire:php: ^7.2 || ^8.0兼容 PHP 7.2 及以上、8.x 全系autoload: 采用classmap方式自动加载src/目录无需手动引入任何文件use PharIo\Version\...即可使用三、版本约束语法精讲3.1 版本号的 SemVer 基础格式文档明确指出版本号遵循语义化版本规范SemVer格式为major.minor.patch即主版本号.次版本号.修订号。约束constraint既可以是一个离散的版本号也可以是一个描述版本范围的表达式。3.2 数学比较运算符约束表达式可以使用常见的数学比较运算符限定范围例如、。这类运算符与下面的两个特殊运算符共同构成完整的约束语法。3.3 脱字符运算符Caret^文档定义^1.0等价于1.0.0 2.0.0语义是主版本号 1 下的所有版本。3.4 波浪号运算符Tilde~文档定义~1.0.0等价于1.0.0 1.1.0语义是次版本号 1.1 之内的所有版本。它的行为取决于是否提供 patch 位提供 patch 位如~1.0.0范围上界为下一个次版本1.1.0不提供 patch 位如~1.0退化为 caret 行为与^1.0完全等价。3.5 运算符行为对照表约束写法等价展开语义^1.01.0.0 2.0.0主版本 1 之内的所有版本~1.0.01.0.0 1.1.0次版本 1.1 之内的所有版本~1.01.0.0 2.0.0同^1.0无 patch 位时退化为 caret1.2.31.2.3精确匹配源码中对应ExactVersionConstraint四、官方使用示例解析约束并检查版本README 给出了核心的实战代码完整继承如下use PharIo\Version\Version; use PharIo\Version\VersionConstraintParser; $parser new VersionConstraintParser(); $caret_constraint $parser-parse( ^7.0 ); $caret_constraint-complies( new Version( 7.0.17 ) ); // true $caret_constraint-complies( new Version( 7.1.0 ) ); // true $caret_constraint-complies( new Version( 6.4.34 ) ); // false $tilde_constraint $parser-parse( ~1.1.0 ); $tilde_constraint-complies( new Version( 1.1.4 ) ); // true $tilde_constraint-complies( new Version( 1.2.0 ) ); // false要点解读VersionConstraintParser::parse()负责把约束字符串解析为约束对象约束对象通过complies(Version $version)判断某个具体版本是否满足约束^7.0允许7.0.17、7.1.0拒绝6.4.34——正好验证主版本 7 之内的所有版本~1.1.0接受1.1.4、拒绝1.2.0——验证上界为 1.1.0 的下一个次版本。4.1 预发布版本pre-release比较文档特别说明自版本 2.0.0 起预发布标签被支持并参与版本比较。官方示例$leftVersion new PharIo\Version\Version(3.0.0-alpha.1); $rightVersion new PharIo\Version\Version(3.0.0-alpha.2); $leftVersion-isGreaterThan($rightVersion); // false $rightVersion-isGreaterThan($leftVersion); // true3.0.0-alpha.2 3.0.0-alpha.1说明预发布标签后面的数字会参与排序。五、源码级原理约束是如何被解析与执行的官方文档只给了使用层面的说明深入 src 目录可以看到完整的实现骨架。下面按解析 → 分组 → 匹配三层拆解。5.1 解析入口VersionConstraintParserVersionConstraintParser.php 是约束语法的翻译中枢其parse()方法处理流程为检测逻辑或OR若字符串含|走handleOrGroup()拆分为多个子约束用OrVersionConstraintGroup组合合法性校验用正则/^[\^~*]?v?[\d.*](?:-.*)?$/i校验约束格式不合法则抛出UnsupportedVersionConstraintException按首字符分派以~开头 →handleTildeOperator()第 68 行以^开头 →handleCaretOperator()第 90 行其余情况解析为精确/范围约束。兜底映射无运算符时根据VersionConstraintValue中 major/minor/patch 是否缺省分别映射到AnyVersionConstraint如*任意版本SpecificMajorVersionConstraint只限定主版本SpecificMajorAndMinorVersionConstraint限定主次版本ExactVersionConstraint精确匹配。5.2 约束树结构AND 与 OR 分组约束对象本质是一棵逻辑树两类分组节点都继承自 AbstractVersionConstraint.php基类仅保存原始约束字符串asString()原样返回AndVersionConstraintGroup.phpcomplies()要求全部子约束都满足才返回 trueOrVersionConstraintGroup.phpcomplies()只要任一子约束满足即返回 true。因此^1.0在内部被展开为1.0.0GreaterThanOrEqualToVersionConstraint与major1SpecificMajorVersionConstraint两个子约束的AND 组合这与文档中1.0.0 2.0.0的展开式完全对应。5.3 Tilde 与 Caret 的代码级差别对比源码可看到两者的关键差异VersionConstraintParser.phpTilde~1.1.0patch位非缺省时构造1.1.0与major1 minor1SpecificMajorAndMinorVersionConstraint的 AND 组合上界被锁死在次版本 1.1 内若 patch 位缺省~1.1直接转调handleCaretOperator——这与文档~1.0等价于^1.0的表述逐字对应Caret^1.0当 major 为 0 时上界约束使用SpecificMajorAndMinorVersionConstraint即^0.2只放行0.2.xmajor 非 0 时使用SpecificMajorVersionConstraint即^1.0放行整个 1.x。5.4 版本比较与预发布排序VersionPreReleaseSuffixVersion.php 是版本号的领域模型构造时用正则第 182-198 行校验字符串必须符合 SemVer非法输入抛InvalidVersionException正则允许可选v前缀、可选 patch 位、-预发布标签、构建元数据isGreaterThan()第 87-125 行按 major → minor → patch 逐位比较数值相同时进入预发布标签比较无预发布标签的版本 有预发布标签的版本两者都有标签则交给PreReleaseSuffix。PreReleaseSuffix.php 内置了一张标签优先级表dev(0) alpha/a(1) beta/b(2) rc(3) patch/p/pl(4)比较时先比标签等级、再比后缀数字第 48-58 行。这就是示例中3.0.0-alpha.2 3.0.0-alpha.1的底层依据。5.5 构建元数据build metadata从 CHANGELOG.md 可以看到3.2.0 起版本支持构建元数据3.2.1 修复了ExactVersionConstraint对构建元数据的处理——构建元数据仅参与等值判断不参与大小排序Version.php 的equals()中对其单独校验。这是 SemVer 规范中build 信息应被忽略于优先级比较的忠实实现。六、约束类型速查与异常体系6.1 约束类族一览src/constraints类匹配规则典型来源约束ExactVersionConstraint版本完全相等1.2.3AnyVersionConstraint任意版本均匹配*SpecificMajorVersionConstraint主版本相等^1.0的上界部分SpecificMajorAndMinorVersionConstraint主次版本相等~1.1.0的上界、^0.2的上界GreaterThanOrEqualToVersionConstraint版本大于等于给定值^/~的下界AndVersionConstraintGroup全部子约束满足AND^1.0、~1.1.0OrVersionConstraintGroup任一子约束满足OR1.0 \|\| 2.06.2 异常体系src/exceptionsInvalidVersionException版本字符串不符合 SemVerVersion.phpUnsupportedVersionConstraintException约束字符串格式不被支持VersionConstraintParser.phpInvalidPreReleaseSuffixException预发布标签非法PreReleaseSuffix.phpNoPreReleaseSuffixException/NoBuildMetaDataException在版本没有对应后缀/元数据时强行读取Version.php 与 Version.php。七、在 ShowDoc 中验证与使用7.1 确认依赖与版本# 在仓库根目录查看依赖声明 composer show phar-io/version # 查看是谁引入了它 composer why phar-io/version当前仓库 composer.lock 锁定该库为3.2.1源码位于 server/vendor/phar-io/versionPHP 运行环境需满足^7.2 || ^8.0。7.2 扩展实践逻辑或约束官方 README 未展开 OR 用法但源码VersionConstraintParser.php确认其支持单竖线|与双竖线||3.1.1 起修复单竖线支持见 CHANGELOG.mduse PharIo\Version\Version; use PharIo\Version\VersionConstraintParser; $parser new VersionConstraintParser(); $constraint $parser-parse(1.0 || 2.0); var_dump($constraint-complies(new Version(1.0.0))); // true var_dump($constraint-complies(new Version(2.0.5))); // true var_dump($constraint-complies(new Version(1.5.0))); // false7.3 实践建议解析约束尽量复用VersionConstraintParser单例式实例避免重复解析开销判断是否满足某段依赖范围时优先使用约束对象而非手写版本比较语义更清晰且与 Composer 行为一致涉及预发布版本排序时直接使用Version::isGreaterThan()其内置的标签优先级表dev alpha beta rc patch已覆盖 PHP 生态常见标签。结语phar-io/version 虽是一个小库却完整实现了 SemVer 版本解析、约束展开、逻辑分组与预发布比较等能力。通过本文你已掌握其安装方式、Caret/Tilde 运算符的精确语义、官方示例的完整用法以及从VersionConstraintParser到各类约束节点的源码级实现原理。在 ShowDoc 这类以 phpunit 支撑测试体系的项目中理解它的工作方式也有助于你读懂 Composer 依赖解析与 PHPUnit 版本选型背后的逻辑。【免费下载链接】showdocShowDoc is a tool greatly applicable for an IT team to share documents online一个非常适合IT团队的在线API文档、技术文档工具项目地址: https://gitcode.com/gh_mirrors/sh/showdoc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进