Review and analyze well-known versioning practices #5
Labels
areas::infra::dependent
Owned tooling that others depend on.
areas::product::release
Affects a project in release form, as consumed by users
tasks::features::new
New features
tasks::review::compliance
Alignment with standards or regulations
tasks::review::design
Setup, architecture or design patterns
Background
Raised by Lamparter in the Windows App Community Discord.
Problem
The new SDK and Server Companion codebases are still nascent and aren't yet ready to publish. Before we publish, we need to determine what practices we want to use for versioning anything we publish or release.
Solution
Review and analyze the well-known options. They each have different rationale and dynamics, and weigh with different pros and cons. We should fully lay out and analyze at least this much to see what would be best for our purposes.
Defining well-known options
SemVer2.0 w/ Standard Prerelease Extension
Old reliable. Documented at https://semver.org/, it works as follows:
The last line, "labels for pre-release and build metadata [...] as an extension to the [...] format.", is referring to versions such as
1.0.0-preview1
,2.0.0-experimental2
, and so on.SemVer2.0 w/ OwlCore prerelease extension
Instead of using the standard
x.x.x-label
extension for prelease, my own OwlCore libraries use a different, custom extension that could be worth consideration as well.Libraries that are still in the "initial incubation" development stage are always MAJOR versioned below
1
, with MINOR versions marking breaking changes and incompatible API changes.The goal here for any good software developer, then, is to minimize the number of minor updates that are "breaking" before you reach something you feel you can call "stable".
In contrast to the standard prerelease extension to semver2.0, this encourages openly practicing planning ahead, testing, and rapidly iterating during your initial development phase. This is an important skill to cultivate at a manageable pace, as collaboration with others is a natural incentive to minimize breaking changes, which removes barriers for further collaboration.
This setup is designed to create a more intuitive way to manage pace, compared to the standard prerelease extension.
SemVer2.0 w/ Windows Community Toolkit extension
The versioning used by the Windows Community Toolkit and Windows Community Toolkit Labs have some unique properties that make them worth considering.
In both repos:
Build.Directory.props
Comparing and analyzing available options
SemVer2.0 w/ Standard Prerelease Extension
Pros:
Cons:
SemVer2.0 w/ OwlCore Prerelease Extension
Pros:
Cons:
SemVer2.0 w/ Windows Community Toolkit Extension
Pros:
Cons:
Choosing what works best
Ultimately, no single system is “the right” answer. It depends on how your team works, the rate of development, and how you want to communicate stability.
I'm thinking that a reasonable strategy could be to adopt the OwlCore approach until we reach a stable version, then adopt standard semver2.0 or the Toolkit variant of semver2.0.
Let's Discuss
The options are fully laid out, and each bring something different to the table. What do we think we should do?
The text was updated successfully, but these errors were encountered: