
PHP 的语义版本控制库。它实现了完整的语义版本 2.0.0 规范,并提供了解析、比较和增量语义版本以及针对约束进行验证的能力。
| 版本 | PHP版本 |
|---|---|
>=1.0, <1.2 | >=5.5 |
>=1.2, <3.0 | >=7.1 |
>=3.0 | >=8.1 |
composer require z4kn4fein/php-semver支持以下选项来构建Version :
使用Version::create()逐部分构建。
Version:: create ( 3 , 5 , 2 , " alpha " , " build " );使用Version::parse()或Version::parseOrNull()解析字符串。
Version:: parse ( " 3.5.2-alpha+build " );在构造的Version对象上可以访问以下信息:
<?php
use z4kn4fein SemVer Version ;
$ version = Version:: parse ( " 2.5.6-alpha.12+build.34 " );
echo $ version -> getMajor (); // 2
echo $ version -> getMinor (); // 5
echo $ version -> getPatch (); // 6
echo $ version -> getPreRelease (); // alpha.12
echo $ version -> getBuildMeta (); // build.34
echo $ version -> isPreRelease (); // true
echo $ version -> isStable (); // false
echo $ version -> withoutSuffixes (); // 2.5.6
echo $ version ; // 2.5.6-alpha.12+build.34默认情况下,版本解析器认为1.0等部分版本和以v前缀开头的版本无效。可以通过将strict参数设置为false来关闭此行为。
echo Version:: parse ( " v2.3-alpha " ); // exception
echo Version:: parse ( " 2.1 " ); // exception
echo Version:: parse ( " v3 " ); // exception
echo Version:: parse ( " v2.3-alpha " , false ); // 2.3.0-alpha
echo Version:: parse ( " 2.1 " , false ); // 2.1.0
echo Version:: parse ( " v3 " , false ); // 3.0.0 可以使用以下比较方法来比较两个Version对象。
<?php
use z4kn4fein SemVer Version ;
// with static methods
echo Version:: lessThan ( " 2.3.4 " , " 2.4.1 " ); // true
echo Version:: lessThanOrEqual ( " 2.4.1 " , " 2.4.1 " ); // true
echo Version:: greaterThan ( " 2.3.1-alpha.5 " , " 2.3.1-alpha.3 " ); // true
echo Version:: greaterThanOrEqual ( " 3.2.3 " , " 3.2.2 " ); // true
echo Version:: equal ( " 3.2.3 " , " 3.2.3+build.3 " ); // true
echo Version:: notEqual ( " 3.2.3 " , " 2.2.4 " ); // true
// compare() or compareString()
echo Version:: compare (Version:: parse ( " 2.3.4 " ), Version:: parse ( " 2.4.1 " )); // -1
echo Version:: compare (Version:: parse ( " 2.3.4 " ), Version:: parse ( " 2.3.4 " )); // 0
echo Version:: compare (Version:: parse ( " 2.3.4 " ), Version:: parse ( " 2.2.0 " )); // 1
echo Version:: compareString ( " 2.3.4 " , " 2.4.1 " ); // -1
echo Version:: compareString ( " 2.3.4 " , " 2.3.4 " ); // 0
echo Version:: compareString ( " 2.3.4 " , " 2.2.0 " ); // 1
// with instance methods
$ version = Version:: parse ( " 2.5.6-alpha.12+build.34 " );
echo $ version -> isLessThan (Version:: parse ( " 2.3.1 " )); // false
echo $ version -> isLessThanOrEqual (Version:: parse ( " 2.5.6-alpha.15 " )); // true
echo $ version -> isGreaterThan (Version:: parse ( " 2.5.6 " )); // false
echo $ version -> isLessThanOrEqual (Version:: parse ( " 2.5.6-alpha.12 " )); // true
echo $ version -> isEqual (Version:: parse ( " 2.5.6-alpha.12+build.56 " )); // true
echo $ version -> isNotEqual (Version:: parse ( " 2.2.4 " )); // trueVersion::sort()和Version::sortString()可用于对版本数组进行排序。
<?php
use z4kn4fein SemVer Version ;
$ versions = array_map ( function ( string $ version ) {
return Version:: parse ( $ version );
}, [
" 1.0.1 " ,
" 1.0.1-alpha " ,
" 1.0.1-alpha.beta " ,
" 1.0.1-alpha.3 " ,
" 1.0.1-alpha.2 " ,
" 1.1.0 " ,
" 1.1.0+build " ,
]);
$ sorted = Version:: sort ( $ versions );
// The result:
// "1.0.1-alpha"
// "1.0.1-alpha.2"
// "1.0.1-alpha.3"
// "1.0.1-alpha.beta"
// "1.0.1"
// "1.1.0"
// "1.1.0+build"您可能想按相反顺序排序,那么您可以使用Version::rsort()或Version::rsortString() 。
<?php
use z4kn4fein SemVer Version ;
$ versions = array_map ( function ( string $ version ) {
return Version:: parse ( $ version );
}, [
" 1.0.1 " ,
" 1.0.1-alpha " ,
" 1.0.1-alpha.beta " ,
" 1.0.1-alpha.3 " ,
" 1.0.1-alpha.2 " ,
" 1.1.0 " ,
" 1.1.0+build " ,
]);
$ sorted = Version:: rsort ( $ versions );
// The result:
// "1.1.0"
// "1.1.0+build"
// "1.0.1"
// "1.0.1-alpha.beta"
// "1.0.1-alpha.3"
// "1.0.1-alpha.2"
// "1.0.1-alpha" Version::compare()和Version::compareString()方法也可以用作usort()的回调来对版本数组进行排序。
<?php
use z4kn4fein SemVer Version ;
$ versions = array_map ( function ( string $ version ) {
return Version:: parse ( $ version );
}, [
" 1.0.1 " ,
" 1.0.1-alpha " ,
" 1.0.1-alpha.beta " ,
" 1.0.1-alpha.3 " ,
" 1.0.1-alpha.2 " ,
" 1.1.0 " ,
" 1.1.0+build " ,
]);
usort ( $ versions , [ " z4kn4feinSemVerVersion " , " compare " ]);
// The result:
// "1.0.1-alpha"
// "1.0.1-alpha.2"
// "1.0.1-alpha.3"
// "1.0.1-alpha.beta"
// "1.0.1"
// "1.1.0"
// "1.1.0+build" 通过约束,可以验证版本是否满足一组规则。约束可以描述为与逻辑OR和AND运算符组合的一个或多个条件。
条件通常由比较运算符和类似>=1.2.0的版本组成。任何大于或等于1.2.0的版本都将满足条件>=1.2.0 。
支持的比较运算符:
=等于(相当于无运算符: 1.2.0表示=1.2.0 )!=不等于<小于<=小于或等于>大于>=大于或等于条件可以用空格连接在一起,表示它们之间的AND逻辑运算符。 OR运算符可以用||来表示或|条件集之间。
例如,约束>=1.2.0 <3.0.0 || >4.0.0翻译为:仅允许大于或等于1.2.0 { AND } 小于3.0.0 { OR } 大于4.0.0的版本。
我们可以注意到,前面的约束的第一部分( >=1.2.0 <3.0.0 )是一个简单的语义版本范围。有更多的方式来表达版本范围;以下部分将介绍所有可用选项。
有一些特定的范围指示符,它们是更扩展范围表达式的糖。
X-Range : x 、 X和*字符可用作版本数字部分的通配符。
1.2.x转换为>=1.2.0 <1.3.0-01.x转换为>=1.0.0 <2.0.0-0*转换为>=0.0.0在部分版本表达式中,缺失的数字被视为通配符。
1.2表示1.2.x最终转换为>=1.2.0 <1.3.0-01表示1.x或1.xx ,最终转换为>=1.0.0 <2.0.0-0连字符范围:描述包含的版本范围。通配符将被评估并考虑到最终范围中。
1.0.0 - 1.2.0转换为>=1.0.0 <=1.2.01.1 - 1.4.0表示>=(>=1.1.0 <1.2.0-0) <=1.4.0最终转换为>=1.1.0 <=1.4.01.1.0 - 2表示>=1.1.0 <=(>=2.0.0 <3.0.0-0)最终转换为>=1.1.0 <3.0.0-0波形符范围 ( ~ ) :指定次要版本时描述补丁级别范围,未指定次要版本时描述次要级别范围。
~1.0.1转换为>=1.0.1 <1.1.0-0~1.0转换为>=1.0.0 <1.1.0-0~1转换为>=1.0.0 <2.0.0-0~1.0.0-alpha.1转换为>=1.0.1-alpha.1 <1.1.0-0插入符范围 ( ^ ) :描述相对于版本最左边的非零部分的范围。
^1.1.2转换为>=1.1.2 <2.0.0-0^0.1.2转换为>=0.1.2 <0.2.0-0^0.0.2转换为>=0.0.2 <0.0.3-0^1.2转换为>=1.2.0 <2.0.0-0^1转换为>=1.0.0 <2.0.0-0^0.1.2-alpha.1转换为>=0.1.2-alpha.1 <0.2.0-0让我们看看如何确定版本是否满足约束。
<?php
use z4kn4fein SemVer Version ;
use z4kn4fein SemVer Constraints Constraint ;
$ constraint = Constraint:: parse ( " >=1.2.0 " );
$ version = Version:: parse ( " 1.2.1 " );
echo $ version -> isSatisfying ( $ constraint ); // true
echo $ constraint -> isSatisfiedBy ( $ version ); // true
// Or using the static satisfies() method with strings:
echo Version:: satisfies ( " 1.2.1 " , " >=1.2.0 " ); // true Version对象可以使用getNext{Major|Minor|Patch|PreRelease}Version方法生成自身的增量版本。这些方法可用于按相应部分递增的顺序确定下一个版本。 Version对象是不可变的,因此每个递增函数都会创建一个新的Version 。
此示例显示了增量如何在稳定版本上工作:
<?php
use z4kn4fein SemVer Version ;
use z4kn4fein SemVer Inc ;
$ stableVersion = Version:: create ( 1 , 0 , 0 );
echo $ stableVersion -> getNextMajorVersion (); // 2.0.0
echo $ stableVersion -> getNextMinorVersion (); // 1.1.0
echo $ stableVersion -> getNextPatchVersion (); // 1.0.1
echo $ stableVersion -> getNextPreReleaseVersion (); // 1.0.1-0
// or with the inc() method:
echo $ stableVersion -> inc (Inc:: MAJOR ); // 2.0.0
echo $ stableVersion -> inc (Inc:: MINOR ); // 1.1.0
echo $ stableVersion -> inc (Inc:: PATCH ); // 1.0.1
echo $ stableVersion -> inc (Inc:: PRE_RELEASE ); // 1.0.1-0如果版本不稳定:
<?php
use z4kn4fein SemVer Version ;
use z4kn4fein SemVer Inc ;
$ unstableVersion = Version:: parce ( " 1.0.0-alpha.2+build.1 " );
echo $ unstableVersion -> getNextMajorVersion (); // 2.0.0
echo $ unstableVersion -> getNextMinorVersion (); // 1.1.0
echo $ unstableVersion -> getNextPatchVersion (); // 1.0.0
echo $ unstableVersion -> getNextPreReleaseVersion (); // 1.0.0-alpha.3
// or with the inc() method:
echo $ unstableVersion -> inc (Inc:: MAJOR ); // 2.0.0
echo $ unstableVersion -> inc (Inc:: MINOR ); // 1.1.0
echo $ unstableVersion -> inc (Inc:: PATCH ); // 1.0.0
echo $ unstableVersion -> inc (Inc:: PRE_RELEASE ); // 1.0.0-alpha.3每个增量函数都提供了在增量版本上设置预发布标识的选项。
<?php
use z4kn4fein SemVer Version ;
use z4kn4fein SemVer Inc ;
$ version = Version:: parce ( " 1.0.0-alpha.1 " );
echo $ version -> getNextMajorVersion ( " beta " ); // 2.0.0-beta
echo $ version -> getNextMinorVersion ( "" ); // 1.1.0-0
echo $ version -> getNextPatchVersion ( " alpha " ); // 1.0.1-alpha
echo $ version -> getNextPreReleaseVersion ( " alpha " ); // 1.0.0-alpha.2
// or with the inc() method:
echo $ version -> inc (Inc:: MAJOR , " beta " ); // 2.0.0-beta
echo $ version -> inc (Inc:: MINOR , "" ); // 1.1.0-0
echo $ version -> inc (Inc:: PATCH , " alpha " ); // 1.0.1-alpha
echo $ version -> inc (Inc:: PRE_RELEASE , " alpha " ); // 1.0.0-alpha.2 可以使用copy()方法复制特定版本。它允许使用可选参数更改复制版本的属性。
$ version = Version:: parse ( " 1.0.0-alpha.2+build.1 " );
echo $ version -> copy (); // 1.0.0-alpha.2+build.1
echo $ version -> copy ( 3 ); // 3.0.0-alpha.2+build.1
echo $ version -> copy ( null , 4 ); // 1.4.0-alpha.2+build.1
echo $ version -> copy ( null , null , 5 ); // 1.0.5-alpha.2+build.1
echo $ version -> copy ( null , null , null , " alpha.4 " ); // 1.0.0-alpha.4+build.1
echo $ version -> copy ( null , null , null , null , " build.3 " ); // 1.0.0-alpha.2+build.3
echo $ version -> copy ( 3 , 4 , 5 ); // 3.4.5-alpha.2+build.1 笔记
在不设置任何可选参数的情况下, copy()方法将生成原始版本的精确副本。
当版本或约束解析由于格式无效而失败时,库会抛出特定的SemverException 。
笔记
Version::parseOrNull()和Constraint::parseOrNull()方法可用于无异常转换,因为它们在解析失败时返回null 。