jelix/version

解析任何版本语法,包括语义版本。使用 Composer 版本约束语法比较版本。

v2.0.1 2022-03-15 21:48 UTC

This package is auto-updated.

Last update: 2024-09-09 14:04:06 UTC


README

这个 PHP 库可以解析任何版本语法,包括 语义版本。它还允许使用 Composer 版本约束语法比较版本。

安装

您可以从 Composer 安装它。在您的项目中

composer require "jelix/version"

用法

解析

使用 Jelix\Version\Parser 类检索包含所有版本信息的 Jelix\Version\Version 对象。

$version = \Jelix\Version\Parser::parse('1.2.3b2');

$version->toString(); // '1.2.3-beta.2'
$version->getMajor(); // 1
$version->getMinor(); // 2
$version->getPatch(); // 3
$version->getStabilityVersion(); // array('beta', '2')

$version->getNextMajorVersion(); // Version object for '2.0.0'
$version->getNextMinorVersion(); // Version object for '1.3.0'
$version->getNextPatchVersion(); // Version object for '1.2.4'
$version->getBranchVersion(); // '1.2'

支持的版本语法示例

  • 1.0, 1.2.3
  • 1.2-alpha, 1.2a, 1.2alpha, 1.2alpha.3, 1.2a1.3
  • 1.2.3-beta, 1.2b, 1.2beta, 1.2beta.3, 1.2b3.4
  • 1.2RC, 1.2-rc.4.5
  • 1.2-dev, 1.2b1-dev, 1.2b1-dev.9, 1.2RC-dev, 1.2RC2-dev.1700

解析器还支持 '次要版本',即附加到版本后面的版本,后面跟一个 - 或一个 :

例如:1.2.3-1.4.51.2.3:1.4.5。在这里,1.4.5 是次要版本。

当检索此类版本的 Version 对象时,您可以通过 getSecondaryVersion() 方法访问次要版本,该方法返回一个 Version 对象

$version = \Jelix\Version\Parser::parse('1.2.3:1.4.5');

$version->toString(); // '1.2.3:1.4.5'
$version->toString(true, false); // '1.2.3'

$version2 = $version->getSecondaryVersion();
$version2->toString(); // '1.4.5'

$version->getNextMajorVersion(); // Version object for '2.0.0'
$version->getNextMinorVersion(); // Version object for '1.3.0'
$version->getNextPatchVersion(); // Version object for '1.2.4'
$version->getBranchVersion(); // '1.2'

简单比较

$v1 = '1.2.3';
$v2 = '1.4.5';
$result = \Jelix\Version\VersionComparator::compareVersion($v1, $v2);

compareVersion() 返回

  • -1 如果 $v1 < $v2
  • 0 如果 $v1 == $v2
  • 1 如果 $v1 > $v2

比较两个版本的示例

\Jelix\Version\VersionComparator::compareVersion('1.2pre','1.2RC');

如果主要版本相等,次要版本也会进行比较。在这种情况下,如果版本字符串中不包含次要版本,则认为它具有 '0.0' 版本号,因此它被认为是比具有次要版本的版本更低。

您还有另一个方法 compare(),它接受 Version 对象作为参数

$v1 = \Jelix\Version\Parser::parse('1.2.3');
$v2 = \Jelix\Version\Parser::parse('1.4.5');
$result = \Jelix\Version\VersionComparator::compare($v1, $v2);

与范围比较

compareVersionRange() 允许您使用运算符比较版本。它与 Composer 支持的版本约束兼容。

  • 比较运算符: ><>=<==!=
  • 没有运算符表示 =
  • ~:指定版本和下一个主要版本之间的范围(不包括下一个主要版本本身及其不稳定变体)
    • ~1.2 等价于 >=1.2 <2.0.0-dev
    • ~1.2.3 等价于 >=1.2.3 <1.3.0-dev
  • '^':指定版本和下一个次要版本之间的范围
    • ^1.2.3 等价于 >=1.2.3 <1.3.0
    • ^0.3 等价于 >=0.3.0 <0.4.0
  • 使用连字符分隔符指定范围:'1.2 - 1.5'
    • 1.0 - 2.0 等价于 >=1.0.0 <2.1(因为 2.0 被解释为 2.0.*)
    • 1.0.0 - 2.1.0 等价于 >=1.0.0 <=2.1.0
  • 它还支持带或不带运算符的版本通配符:1.*1.2.*

您可以使用布尔运算符组合多个约束

  • AND 运算符:,
  • OR 运算符:|||
// check if 0.5 is between 0.8 and 1.0 or if it is higher than 2.0
\Jelix\Version\VersionComparator::compareVersionRange('0.5','<1.0,>0.8|>2.0');

// check if 0.5 is between 0.8 and 1.0
\Jelix\Version\VersionComparator::compareVersionRange('0.5','0.8 - 1.0');

// with a wildcard
\Jelix\Version\VersionComparator::compareVersionRange('1.1', '1.1.*'); // returns true
\Jelix\Version\VersionComparator::compareVersionRange('1.1.2', '1.2.*'); // returns false
\Jelix\Version\VersionComparator::compareVersionRange('1.3.0', '>=1.2.*'); // returns true

注意:范围比较仅在主要版本上执行。如果版本字符串包含次要版本,则不会比较次要版本。要比较次要版本与范围,应使用 getSecondaryVersion() 方法检索次要版本。

$version = Jelix\Version\Parser::parse('1.2.3:1.0.0');

\Jelix\Version\VersionComparator::compareVersionRange($version, '>=1.2.*'); // returns true

$version2 = $version->getSecondaryVersion();
$version2->toString(); // '1.0.0'

\Jelix\Version\VersionComparator::compareVersionRange($version2, '>=1.2.*'); // returns false

历史

这些类别的祖先已经包含在 Jelix 框架中多年,直到 Jelix 1.6 版本,并于 2016 年作为一个独立的仓库发布。