README
¶
Composer SemVer
Static linked CLI wrapper for composer/semver.
Parsing and validating versions exactly like Composer does without installing PHP.
Built with ♥ by Typist Tech
Usage
Normalize Versions
Normalizes a version string to be able to perform comparisons on it.
This is a wrapper of the Composer\Semver\VersionParser::normalize() method.
$ composer-semver normalize '1.2-p.5+foo'
1.2.0.0-patch5
# Status code 0 means valid versions
$ echo $?
0
$ composer-semver normalize 'not-a-version'
[ERROR] Invalid version string "not-a-version"
# Non-zero status codes mean invalid versions
$ echo $?
1
$ composer-semver normalize --help
Description:
Normalizes a version string to be able to perform comparisons on it
Usage:
normalize [options] [--] <version>
Arguments:
version
Options:
--full-version=FULL-VERSION Complete version string to give more context.
-h, --help Display help for the given command. When no command is given display help for the list command
--silent Do not output any message
-q, --quiet Only errors are displayed. All other output is suppressed
-V, --version Display this application version
--ansi|--no-ansi Force (or disable --no-ansi) ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Help:
This is a wrapper of the Composer\Semver\VersionParser::normalize() method.
Parse Constraints
Parses a constraint string and strip its ignorable parts.
This is a wrapper of the Composer\Semver\VersionParser::parseConstraints() method.
$ composer-semver parse '>=1.2 <2.0 || ~3.4.5 || ^6.7'
[[>= 1.2.0.0-dev < 2.0.0.0-dev] || [>= 3.4.5.0-dev < 3.5.0.0-dev] || [>= 6.7.0.0-dev < 7.0.0.0-dev]]
# Status code 0 means valid constraints
$ echo $?
0
$ composer-semver parse '~>1.2'
[ERROR] Could not parse version constraint ~>1.2: Invalid operator "~>", you probably meant to use the "~"
operator
# Non-zero status codes mean invalid constraints
$ echo $?
1
$ composer-semver parse --help
Description:
Parses a constraint string and strip its ignorable parts
Usage:
parse <constraints>
Arguments:
constraints
Options:
-h, --help Display help for the given command. When no command is given display help for the list command
--silent Do not output any message
-q, --quiet Only errors are displayed. All other output is suppressed
-V, --version Display this application version
--ansi|--no-ansi Force (or disable --no-ansi) ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Help:
This is a wrapper of the Composer\Semver\VersionParser::parseConstraints() method.
Print Bundled PHP and composer/semver Versions
$ composer-semver --version
Dump Shell Completion Scripts
For shell completions, follow the instructions from:
$ composer-semver completion --help
If you installed Composer SemVer via Homebrew, completion scripts are managed by Homebrew.
Read more at https://docs.brew.sh/Shell-Completion
[!TIP] Hire Tang Rufus!
I am looking for my next role, freelance or full-time. If you find this tool useful, I can build you more weird stuffs like this. Let's talk if you are hiring PHP / Ruby / Go developers.
Contact me at https://typist.tech/contact/
Why
Which version numbering system does Composer itself use?
Composer uses Semantic Versioning (aka SemVer) 2.0.0.
-- Composer FAQ
Under the hood, Composer uses composer/semver to parse and validate versions.
Despite the lie on Composer FAQ, the fragmentary documentation, and the deceitful package name composer/semver,
Composer implements only a subset of Semantic Versioning specification while supports some uncommon versioning schemes.
Working with Composer packages versions without composer/semver is a bit tricky.
"A bit tricky" is an understatement.
| Version | Validity |
|---|---|
1.2.3 |
✅ Valid. |
1.2.3.4 |
✅ Valid. But not SemVer compliant. |
1.0.0-a |
✅ Valid. |
1.0.0-b |
✅ Valid. |
1.0.0-c |
❌ Invalid. But SemVer compliant. Composer only accepts a limited sets of pre-release versions. |
99999 |
✅ Valid. Composer normalize it to 99999.0.0.0. |
100000.0.0 |
✅ Valid |
100000.0.0.0 |
❌ Invalid. Starting from 100000, Composer treats it as CalVer which cannot have 4 bits. |
2010-01-02 |
✅ Valid. |
2010-01-02-10-20-30.5 |
✅ Valid. |
20100102-203040 |
✅ Valid. |
20100102.0.3.4 |
❌ Invalid. CalVer cannot have 4 bits. |
2023013.0.0 |
❌ Invalid. YYYYMMD is a bad CalVer major version. |
202301311.0.0 |
❌ Invalid. YYYYMMDDh is a bad CalVer major version. |
20230131000.0.0 |
❌ Invalid.YYYYMMDDhhm is a bad CalVer major version. |
2023013100000.0.0 |
❌ Invalid. YYYYMMDDhhmmX is a bad CalVer major version. |
000.001.003.004 |
✅ Valid. Composer normalizes it to 000.001.003.004. The leading zeros are significant and cannot be ignored. |
0700 |
✅ Valid. Composer normalizes it to 0700.0.0.0. The leading zero is significant and cannot be ignored. |
1.00.000 |
✅ Valid. Composer normalizes it to 1.00.000.0. All the zeroes are significant and cannot be ignored. |
Composer SemVer wraps composer/semver and the PHP runtime as a static linked CLI tool,
so you can work with the package versions exactly like Composer does without installing PHP.
[!TIP] Hire Tang Rufus!
There is no need to understand any of these quirks. Let me handle them for you. I am seeking my next job, freelance or full-time.
If you are hiring PHP / Ruby / Go developers, contact me at https://typist.tech/contact/
Installation
Homebrew (macOS / Linux) (Recommended)
brew tap typisttech/tap
brew install typisttech/tap/composer-semver
apt-get (Debian based distributions, for example: Ubuntu)
curl -1sLf 'https://dl.cloudsmith.io/public/typisttech/oss/setup.deb.sh' | sudo -E bash
sudo apt-get install composer-version
Instead of the automatic setup script, you can manually configure the repository with the instructions on Cloudsmith.
Manual .deb (Debian based distributions, for example: Ubuntu)
[!WARNING] If you install the
.debfile manually, you have to take care of updating it by yourself.
Download the latest .deb file from GitHub Releases, or via gh:
# Both arm64 (aarch64) and amd64 (x86_64) architectures are available.
gh release download --repo 'typisttech/composer-semver' --pattern 'composer-semver_linux_arm64.deb'
Optionally, verify the .deb file:
gh attestation verify --repo 'typisttech/composer-semver' 'composer-semver_linux_arm64.deb'
Finally, install the package:
sudo dpkg -i composer-semver_linux_arm64.deb
Manual Binary
[!WARNING] If you install the binary manually, you have to take care of updating it by yourself.
Download the latest .tar.gz file from GitHub Releases, or via gh:
# Both darwin (macOS) and linux operating systems are available.
# Both arm64 (aarch64) and amd64 (x86_64) architectures are available.
gh release download --repo 'typisttech/composer-semver' --pattern 'composer-semver_darwin_arm64.tar.gz'
Optionally, verify the .tar.gz file:
gh attestation verify --repo 'typisttech/composer-semver' 'composer-semver_darwin_arm64.tar.gz'
Finally, unarchive and move the binary into $PATH:
tar -xvf 'composer-semver_darwin_arm64.tar.gz'
# Or, move it to any directory under `$PATH`
mv composer-semver /usr/local/bin
Alternatives
- ComVer
A failed attempt to re-implementcomposer/semverin Go. It only supports a subset of Composer versioning.
Credits
Composer SemVer is a Typist Tech project and maintained by Tang Rufus, freelance developer for hire.
Full list of contributors can be found on GitHub.
Copyright and License
This project is a free software distributed under the terms of the MIT license. For the full license, see LICENSE.
Contribute
Feedbacks / bug reports / pull requests are welcome.
Directories
¶
| Path | Synopsis |
|---|---|
|
normalize/fail
command
|
|
|
normalize/success
command
|
|
|
parse/fail
command
|
|
|
parse/success
command
|