Semantic Versioning
Versionator helps you follow Semantic Versioning 2.0.0 (SemVer) for your projects. This page explains the specification and how versionator implements it.
Version Format
MAJOR.MINOR.PATCH[-PRERELEASE][+METADATA]
Core Version
The core version consists of three non-negative integers:
| Component | When to Increment | Resets |
|---|---|---|
| MAJOR | Incompatible API changes | MINOR, PATCH to 0 |
| MINOR | New backwards-compatible functionality | PATCH to 0 |
| PATCH | Backwards-compatible bug fixes | Nothing |
Pre-release Identifier
Pre-release versions are denoted by a hyphen followed by identifiers:
1.0.0-alpha
1.0.0-alpha.1
1.0.0-beta.2
1.0.0-rc.1
Rules:
- Identifiers consist of alphanumerics and hyphens
[0-9A-Za-z-] - Numeric identifiers must not have leading zeros
- Pre-release versions have lower precedence than normal versions
- Identifiers are separated by dots (
.) in SemVer, but versionator uses dashes (-) for template input for clarity
Build Metadata
Build metadata is denoted by a plus sign followed by identifiers:
1.0.0+20241212
1.0.0+build.123
1.0.0-alpha.1+001
Rules:
- Identifiers consist of alphanumerics and hyphens
[0-9A-Za-z-] - Identifiers are separated by dots (
.) - Build metadata is ignored when determining version precedence
- Two versions differing only in metadata are considered equal for ordering
Versionator Implementation
Incrementing Behavior
When you increment a version component, versionator follows SemVer rules:
# Starting version: 1.2.3-alpha
versionator major increment
# Result: 2.0.0 (minor, patch reset; pre-release cleared)
versionator minor increment
# Result: 1.3.0 (patch reset; pre-release cleared)
versionator patch increment
# Result: 1.2.4 (pre-release cleared)
Pre-release is always cleared when incrementing any version component, per SemVer spec.
Decrementing Behavior
Decrementing works similarly but doesn't reset other components:
# Starting version: 2.1.3
versionator major decrement
# Result: 1.1.3
versionator minor decrement
# Result: 2.0.3
versionator patch decrement
# Result: 2.1.2
Pre-release Separators
In the VERSION file and output, pre-release components use dashes (-):
1.2.3-alpha-1
1.2.3-beta-2
1.2.3-rc-1
When specifying pre-release templates, you provide the dashes:
versionator output version --prerelease="alpha-{{CommitsSinceTag}}"
# Output: 1.2.3-alpha-5
Metadata Separators
Build metadata components use dots (.):
1.2.3+20241212.abc1234
1.2.3+build.123.sha.abc1234
When specifying metadata templates:
versionator output version --metadata="{{BuildDateTimeCompact}}.{{ShortHash}}"
# Output: 1.2.3+20241211103045.abc1234
Version Precedence
Versions are compared for precedence according to SemVer:
- Compare MAJOR, MINOR, PATCH numerically
- A version with pre-release has lower precedence than the normal version
- Pre-release identifiers are compared left-to-right
- Numeric identifiers compared numerically, alphanumeric lexically
- Numeric identifiers have lower precedence than alphanumeric
- Build metadata is ignored in precedence
Examples
1.0.0 < 2.0.0 < 2.1.0 < 2.1.1
1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta
1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0
Common Patterns
Alpha/Beta/RC Workflow
# Development starts
versionator minor increment
versionator config prerelease set alpha
# Result: 1.1.0-alpha
# Alpha iterations
versionator config prerelease set alpha.2
versionator config prerelease set alpha.3
# Move to beta
versionator config prerelease set beta
# Release candidate
versionator config prerelease set rc.1
# Final release
versionator config prerelease clear
# Result: 1.1.0
Nightly Builds
Using metadata for build identification:
versionator output version \
-t "{{MajorMinorPatch}}{{MetadataWithPlus}}" \
--metadata="{{BuildDateTimeCompact}}.{{ShortHash}}"
# Output: 1.1.0+20241211103045.abc1234
See Also
- Version Grammar - Understanding version string format (beginner-friendly)
- Pre-release Templates - Dynamic pre-release identifiers
- Metadata Templates - Build metadata configuration
- SemVer.org - Official specification
- VERSION Grammar (EBNF) - Formal grammar specification