To know why another Software Versioning Schema exists as an alternative to SemVer please read here.
Explicit Versioning is a specification for developers that care about releasing software and explicit announce intended breaking changes, by using an extra required identifier to handle Incompatible changes that are intentional.
Explicit Versioning specification will use a schema composed of 4 identifiers, that are represented like:
- Disruptive.Incompatible.Compatible.Fix-Optional_Identifiers
Creating a Tag, by incremented any of the 4 required identifiers, represents a new Software Release.
Given 1.0.0.0
as the first version for a Production Release:
- Disruptive
- is incremented when deep changes will occur across the API, Web or CLI Interfaces in a way that will be Disruptive for the previous User Experience.
- version will go from
1.0.0.0
to2.0.0.0
.
- Incompatible
- is incremented when a Intentional and backwards Incompatible change is introduced as part of a bug or security fix, while keeping the affected User Experience localized in a specific Feature of the API, Web or CLI Interfaces.
- version will go from
1.0.0.0
to1.1.0.0
.
- Compatible
- is incremented when adding or improving functionality in a Compatible way with previous User Experience when using the API, Web or CLI Interfaces.
- version will go from
1.0.0.0
to1.0.1.0
.
- Fix
- is incremented when a bug is fixed, or a security gap is solved without affecting the previous User Experience for using the API, Web or CLI Interfaces.
- version will go from
1.0.0.0
to1.0.0.1
.
NOTE:
The usage of
v
preceding the schema, likev1.0.0.0
is not recommend, but is acceptable.
Each team of Developers and Organization may have specific needs in their Software release process that they can address with the Optional Identifiers.
-
- Unstable Release to gather earlier user feedback in the Development process.
- Tags will look
1.0.0.0-Alpha1
,1.0.0.0-Alpha2
...
-
- Experimental Release to test viability and get user feedback.
- Tags will look
1.0.0.0-Beta1
,1.0.0.0-Beta2
...
-
- A stable release to get user feedback and hunt last minute bugs.
- Tags will look like
1.0.0.0-RC1
,1.0.0.0-RC2
...
-
- A release that guarantees the software will be supported until a certain date, using the format
LTS_YYYY-MM
. - Tag
1.0.0.0-LTS_2019-05
- guarantees support until May of 2019 for any Incompatible, Compatible or Fix Release.
- to be required as
1.*
.
- Tag
1.1.0.0-LTS_2019-05
- guarantees support until May of 2019 for any Compatible or Fix Release.
- to be required as
1.1.*
.
- Tag
1.0.1.0-LTS_2019-05
- guarantees support until May of 2019 for any Fix Release.
- to be required as
1.0.1.*
.
- A release that guarantees the software will be supported until a certain date, using the format
-
- A Release to announce the termination of support for a Software Life Cycle.
- MUST NOT be used when already exists a LTS Release for this Software Life Cycle.
- Given that the last tag was
1.0.8.22
:- the End of Support tag will be
1.0.9.0-EOS_2018-05
. - guarantees support for Security and Bug Fixes Releases until May of 2018.
- to be required as
1.0.9.*
. - in any tag from
1.*
MUST NOT exist a LTS Release.
- the End of Support tag will be
- Give a name to the Release, like
1.0.0.0-Xenial_Xerus
. - Track the build, like
1.0.1.0-Build_12345
. - For other wisely chosen situations, that should be Explicit and not Implicit.
- Announce a Major release.
- Breaking change release.
- New Feature release.
- Security release.
- Patch release.
- To identify a Developer. Use branches instead.
- Any other situation that clashes with the Required Identifiers implementation.
NOTE:
When creating a tag a message can be added, therefore don't use an Optional Identifier for something that is more appropriated to be told in the message.
Basically Explicit Versioning main differential factors to SemVer versioning schema are:
- Isolates any Incompatible Release, that is Intentional, from any other type of Release.
- Only increment the most left number when a Disruptive situation happens in the Software, not to be increment per the minimal backward Incompatible change.
- Remove/reduces the ambiguity from usage/interpretation of the versioning schema.