
Biblioteca de versionamento semântico para PHP. Ele implementa a especificação semântica completa da versão 2.0.0 e fornece capacidade de analisar , comparar e incrementar versões semânticas juntamente com validação contra restrições .
| Versão | Versão PHP |
|---|---|
>=1.0, <1.2 | >=5,5 |
>=1.2, <3.0 | >=7,1 |
>=3.0 | >=8,1 |
composer require z4kn4fein/php-semver As seguintes opções são suportadas para construir um Version :
Construindo parte por parte com Version::create() .
Version:: create ( 3 , 5 , 2 , " alpha " , " build " ); Análise de uma string com Version::parse() ou Version::parseOrNull() .
Version:: parse ( " 3.5.2-alpha+build " ); As informações a seguir estão acessíveis em um objeto Version construído:
<?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 Por padrão, o analisador de versão considera versões parciais como 1.0 e versões que começam com o prefixo v inválidas. Esse comportamento pode ser desativado definindo o parâmetro strict como 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 É possível comparar dois objetos Version com os seguintes métodos de comparação.
<?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() e Version::sortString() estão disponíveis para classificar uma matriz de versões.
<?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" Você pode querer classificar na ordem inversa, então você pode usar Version::rsort() ou 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" Os métodos Version::compare() e Version::compareString() também podem ser usados como retorno de chamada para usort() para classificar um array de versões.
<?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" Com restrições é possível validar se uma versão satisfaz ou não um conjunto de regras. Uma restrição pode ser descrita como uma ou mais condições combinadas com operadores lógicos OR e AND .
As condições geralmente são compostas por um operador de comparação e uma versão como >=1.2.0 . A condição >=1.2.0 seria atendida por qualquer versão maior ou igual a 1.2.0 .
Operadores de comparação suportados:
= Igual (equivalente a nenhum operador: 1.2.0 significa =1.2.0 )!= Diferente< Menos que<= Menor ou igual> Maior que>= Maior ou igual As condições podem ser unidas com espaços em branco, representando o operador lógico AND entre elas. O operador OR pode ser expresso com || ou | entre conjuntos de condições.
Por exemplo, a restrição >=1.2.0 <3.0.0 || >4.0.0 se traduz em: Somente são permitidas as versões maiores ou iguais a 1.2.0 { AND } menores que 3.0.0 { OR } maiores que 4.0.0 .
Podemos notar que a primeira parte da restrição anterior ( >=1.2.0 <3.0.0 ) é um intervalo de versão semântica simples. Existem mais maneiras de expressar intervalos de versões; a seção a seguir examinará todas as opções disponíveis.
Existem indicadores de intervalo específicos que são açúcares para expressões de intervalo mais extenso.
X-Range : Os caracteres x , X e * podem ser usados como curinga para as partes numéricas de uma versão.
1.2.x se traduz em >=1.2.0 <1.3.0-01.x se traduz em >=1.0.0 <2.0.0-0* se traduz em >=0.0.0Nas expressões de versão parcial, os números ausentes são tratados como curingas.
1.2 significa 1.2.x , que finalmente se traduz em >=1.2.0 <1.3.0-01 significa 1.x ou 1.xx que finalmente se traduz em >=1.0.0 <2.0.0-0Intervalo de hífen : descreve um intervalo de versões inclusivo. Os curingas são avaliados e levados em consideração na faixa final.
1.0.0 - 1.2.0 se traduz em >=1.0.0 <=1.2.01.1 - 1.4.0 significa >=(>=1.1.0 <1.2.0-0) <=1.4.0 que finalmente se traduz em >=1.1.0 <=1.4.01.1.0 - 2 significa >=1.1.0 <=(>=2.0.0 <3.0.0-0) que finalmente se traduz em >=1.1.0 <3.0.0-0 Intervalo de til ( ~ ) : Descreve um intervalo de nível de patch quando a versão secundária é especificada ou um intervalo de nível secundário quando não é.
~1.0.1 se traduz em >=1.0.1 <1.1.0-0~1.0 se traduz em >=1.0.0 <1.1.0-0~1 se traduz em >=1.0.0 <2.0.0-0~1.0.0-alpha.1 se traduz em >=1.0.1-alpha.1 <1.1.0-0 Intervalo de intercalação ( ^ ) : Descreve um intervalo em relação à parte diferente de zero mais à esquerda da versão.
^1.1.2 se traduz em >=1.1.2 <2.0.0-0^0.1.2 se traduz em >=0.1.2 <0.2.0-0^0.0.2 se traduz em >=0.0.2 <0.0.3-0^1.2 se traduz em >=1.2.0 <2.0.0-0^1 se traduz em >=1.0.0 <2.0.0-0^0.1.2-alpha.1 se traduz em >=0.1.2-alpha.1 <0.2.0-0Vamos ver como podemos determinar se uma versão satisfaz uma restrição ou não.
<?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 Os objetos Version podem produzir versões incrementadas de si mesmos com os métodos getNext{Major|Minor|Patch|PreRelease}Version . Esses métodos podem ser usados para determinar a próxima versão na ordem incrementada pela peça correspondente. Os objetos Version são imutáveis , portanto cada função incremental cria uma nova Version .
Este exemplo mostra como funciona a incrementação em uma versão estável:
<?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-0No caso de uma versão instável:
<?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.3Cada função de incremento oferece a opção de definir uma identidade de pré-lançamento na versão incrementada.
<?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 É possível fazer uma cópia de uma versão específica com o método copy() . Permite alterar as propriedades da versão copiada com parâmetros opcionais.
$ 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 Observação
Sem definir nenhum parâmetro opcional, o método copy() produzirá uma cópia exata da versão original.
Quando a análise de versão ou restrição falha devido a um formato inválido, a biblioteca lança uma SemverException específica.
Observação
Os métodos Version::parseOrNull() e Constraint::parseOrNull() podem ser usados para conversões sem exceção, pois retornam null quando a análise falha.