Pustaka Versi Semantik untuk PHP. Ini mengimplementasikan spesifikasi semantik versi 2.0.0 penuh dan menyediakan kemampuan untuk mengurai , membandingkan , dan menambah versi semantik bersama dengan validasi terhadap batasan .
Versi | Versi PHP |
---|---|
>=1.0, <1.2 | >=5,5 |
>=1.2, <3.0 | >=7.1 |
>=3.0 | >=8.1 |
composer require z4kn4fein/php-semver
Opsi berikut didukung untuk membuat Version
:
Membangun bagian demi bagian dengan Version::create()
.
Version:: create ( 3 , 5 , 2 , " alpha " , " build " );
Mengurai dari string dengan Version::parse()
atau Version::parseOrNull()
.
Version:: parse ( " 3.5.2-alpha+build " );
Informasi berikut dapat diakses pada objek Version
yang dibuat:
<?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
Secara default, pengurai versi menganggap versi parsial seperti 1.0
dan versi yang dimulai dengan awalan v
tidak valid. Perilaku ini dapat dimatikan dengan menyetel parameter strict
ke 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
Dimungkinkan untuk membandingkan dua objek Version
dengan metode perbandingan berikut.
<?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()
dan Version::sortString()
tersedia untuk mengurutkan berbagai versi.
<?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"
Anda mungkin ingin mengurutkan dalam urutan terbalik, lalu Anda dapat menggunakan Version::rsort()
atau 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()
dan Version::compareString()
juga dapat digunakan sebagai panggilan balik untuk usort()
untuk mengurutkan berbagai versi.
<?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"
Dengan batasan, dimungkinkan untuk memvalidasi apakah suatu versi memenuhi serangkaian aturan atau tidak. Batasan dapat digambarkan sebagai satu atau lebih kondisi yang digabungkan dengan operator logika OR
dan AND
.
Kondisi biasanya terdiri dari operator perbandingan dan versi seperti >=1.2.0
. Kondisi >=1.2.0
akan dipenuhi oleh versi apa pun yang lebih besar dari atau sama dengan 1.2.0
.
Operator perbandingan yang didukung:
=
Sama (setara dengan tanpa operator: 1.2.0
berarti =1.2.0
)!=
Tidak sama<
Kurang dari<=
Kurang dari atau sama dengan>
Lebih besar dari>=
Lebih besar dari atau sama dengan Kondisi dapat digabungkan dengan spasi, yang mewakili operator logika AND
di antara kondisi tersebut. Operator OR
dapat dinyatakan dengan ||
atau |
antar kumpulan kondisi.
Misalnya batasan >=1.2.0 <3.0.0 || >4.0.0
diterjemahkan menjadi: Hanya versi yang diperbolehkan yang lebih besar atau sama dengan 1.2.0
{ DAN } kurang dari 3.0.0
{ ATAU } lebih besar dari 4.0.0
.
Kita dapat melihat bahwa bagian pertama dari batasan sebelumnya ( >=1.2.0 <3.0.0
) adalah rentang versi semantik sederhana. Ada lebih banyak cara untuk mengekspresikan rentang versi; bagian berikut akan membahas semua opsi yang tersedia.
Ada indikator rentang tertentu yang merupakan gula untuk ekspresi rentang yang lebih luas.
X-Range : Karakter x
, X
, dan *
dapat digunakan sebagai wildcard untuk bagian numerik suatu versi.
1.2.x
diterjemahkan menjadi >=1.2.0 <1.3.0-0
1.x
diterjemahkan menjadi >=1.0.0 <2.0.0-0
*
diterjemahkan menjadi >=0.0.0
Dalam ekspresi versi parsial, angka yang hilang diperlakukan sebagai karakter pengganti.
1.2
berarti 1.2.x
yang akhirnya diterjemahkan menjadi >=1.2.0 <1.3.0-0
1
berarti 1.x
atau 1.xx
yang akhirnya diterjemahkan menjadi >=1.0.0 <2.0.0-0
Rentang Tanda Hubung : Menjelaskan rentang versi inklusif. Wildcard dievaluasi dan diperhitungkan dalam rentang akhir.
1.0.0 - 1.2.0
diterjemahkan menjadi >=1.0.0 <=1.2.0
1.1 - 1.4.0
berarti >=(>=1.1.0 <1.2.0-0) <=1.4.0
yang akhirnya diterjemahkan menjadi >=1.1.0 <=1.4.0
1.1.0 - 2
berarti >=1.1.0 <=(>=2.0.0 <3.0.0-0)
yang akhirnya diterjemahkan menjadi >=1.1.0 <3.0.0-0
Rentang Tilde ( ~
) : Menjelaskan rentang level patch ketika versi minor ditentukan atau rentang level minor jika tidak ditentukan.
~1.0.1
diterjemahkan menjadi >=1.0.1 <1.1.0-0
~1.0
diterjemahkan menjadi >=1.0.0 <1.1.0-0
~1
diterjemahkan menjadi >=1.0.0 <2.0.0-0
~1.0.0-alpha.1
diterjemahkan menjadi >=1.0.1-alpha.1 <1.1.0-0
Rentang Sisipan ( ^
) : Menjelaskan rentang yang berkaitan dengan bagian paling kiri bukan nol pada versi.
^1.1.2
diterjemahkan menjadi >=1.1.2 <2.0.0-0
^0.1.2
diterjemahkan menjadi >=0.1.2 <0.2.0-0
^0.0.2
diterjemahkan menjadi >=0.0.2 <0.0.3-0
^1.2
diterjemahkan menjadi >=1.2.0 <2.0.0-0
^1
diterjemahkan menjadi >=1.0.0 <2.0.0-0
^0.1.2-alpha.1
diterjemahkan menjadi >=0.1.2-alpha.1 <0.2.0-0
Mari kita lihat bagaimana kita dapat menentukan apakah suatu versi memenuhi batasan atau tidak.
<?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
Objek Version
dapat menghasilkan versi tambahan dari dirinya sendiri dengan metode getNext{Major|Minor|Patch|PreRelease}Version
. Metode ini dapat digunakan untuk menentukan versi selanjutnya secara berurutan ditambah dengan bagian yang sesuai. Objek Version
tidak dapat diubah , sehingga setiap fungsi yang bertambah akan membuat Version
baru.
Contoh ini menunjukkan cara kerja penambahan pada versi stabil:
<?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
Jika versinya tidak stabil:
<?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
Setiap fungsi penambahan menyediakan opsi untuk mengatur identitas pra-rilis pada versi yang bertambah.
<?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
Dimungkinkan untuk membuat salinan versi tertentu dengan metode copy()
. Ini memungkinkan mengubah properti versi yang disalin dengan parameter opsional.
$ 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
Catatan
Tanpa menyetel parameter opsional apa pun, metode copy()
akan menghasilkan salinan persis dari versi aslinya.
Ketika penguraian versi atau batasan gagal karena format yang tidak valid, perpustakaan akan menampilkan SemverException
tertentu.
Catatan
Version::parseOrNull()
dan Constraint::parseOrNull()
dapat digunakan untuk konversi tanpa pengecualian karena mengembalikan null
ketika penguraian gagal.