PHP implementation of the Semantic Versioning 2.0 documented on semver.org
Install the latest version with
$ composer require semver/semver
This library is standalone so you don't have to worry about dependencies.
The only requirement is to use PHP 7
from decomposed elements
use SemVer\SemVer\Version;
$version = new Version(1, 2, 3);
$version = new Version(1, 2, 3, '', 'exp.sha.5114f85');
$version = new Version(1, 2, 3, 'rc.1', 'exp.sha.5114f85');
from a string
use SemVer\SemVer\Version;
$version = Version::fromString('1.2.3');
$version = Version::fromString('1.2.3+exp.sha.5114f85');
$version = Version::fromString('1.2.3-rc.1+exp.sha.5114f85');
It will always create a new Version, leaving the current as it is.
update the major version
use SemVer\SemVer\Version;
$version = Version::fromString('1.2.3');
$nextVersion = $version->major();
var_dump($nextVersion->isEquals(new Version('2.0.0')); // true
Special case: when there is a pre-release and both minor and patch version are equals to 0, the next major version is the actual version without the pre-release
use SemVer\SemVer\Version;
$version = Version::fromString('1.0.0-rc.1');
$nextVersion = $version->major();
var_dump($nextVersion->isEquals(new Version('1.0.0')); // true
update the minor version
use SemVer\SemVer\Version;
$version = Version::fromString('1.2.3');
$nextVersion = $version->minor();
var_dump($nextVersion->isEquals(new Version('1.3.0')); // true
Special case: when there is a pre-release and the patch version is equal to 0, the next minor version is the actual version without the pre-release
use SemVer\SemVer\Version;
$version = Version::fromString('1.1.0-rc.1');
$nextVersion = $version->minor();
var_dump($nextVersion->isEquals(new Version('1.1.0')); // true
update the patch version
use SemVer\SemVer\Version;
$version = Version::fromString('1.2.3-rc.1');
$nextVersion = $version->patch();
var_dump($nextVersion->isEquals(new Version('1.2.3')); // true
Special case: when there is a pre-release, the next major version is the actual version without the pre-release
use SemVer\SemVer\Version;
$version = Version::fromString('1.0.0-rc.1');
$nextVersion = $version->patch();
var_dump($nextVersion->isEquals(new Version('1.0.0')); // true
use SemVer\SemVer\Version;
use SemVer\SemVer\VersionComparator;
$version1 = Version::fromString('1.2.3');
$version2 = Version::fromString('1.2.3-rc.1+exp.sha.5114f85');
var_dump(VersionComparator::compare($version1, $version2)); // 1
var_dump($version1->equals($version2)); // false
var_dump($version1->greaterThan($version2)); // true
var_dump($version1->greaterThanOrEqual($version2)); // true
var_dump($version1->lessThan($version2)); // false
var_dump($version1->lessThanOrEqual($version2)); // false
use SemVer\SemVer\Version;
$versions = [
Version::fromString('2.0.0'),
Version::fromString('1.2.3'),
Version::fromString('1.3.3'),
Version::fromString('1.3.3-alpha.10'),
Version::fromString('1.3.3-alpha.2'),
Version::fromString('1.2.3-rc.1+exp.sha.5114f85'),
];
var_dump(VersionSorter::sort($versions));
// Result:
// [
// Version::fromString('1.2.3-rc.1+exp.sha.5114f85'),
// Version::fromString('1.2.3'),
// Version::fromString('1.3.3-alpha.2'),
// Version::fromString('1.3.3-alpha.10'),
// Version::fromString('1.3.3'),
// Version::fromString('2.0.0'),
// ];