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 " )); // true
Version::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-0
1.x
轉換為>=1.0.0 <2.0.0-0
*
轉換為>=0.0.0
在部分版本表達式中,缺少的數字被視為通配符。
1.2
表示1.2.x
最終轉換為>=1.2.0 <1.3.0-0
1
表示1.x
或1.xx
,最終轉換為>=1.0.0 <2.0.0-0
連字符範圍:描述包含的版本範圍。通配符將被評估並考慮到最終範圍。
1.0.0 - 1.2.0
轉換為>=1.0.0 <=1.2.0
1.1 - 1.4.0
表示>=(>=1.1.0 <1.2.0-0) <=1.4.0
最終轉換為>=1.1.0 <=1.4.0
1.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
。