Библиотека семантического управления версиями для 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
в случае сбоя анализа.