I personally prefer Semver. I think it's reasonable, simple, and makes sense. But as a good Haskell citizen, I'd like to be PVP-compliant as well. Here is a bit of a graphic showing how the two systems are almost the same:
PVP: A . B . C . ...
Semver: Major . Minor . Patch
^ ^ ^
| | |
| | ` increment for other changes
| |
| ` increment on non-breaking change
|
` increment on breaking change
Basically, PVP's A
is useless from a compatibility standpoint. It's just a bystander in the "increment A.B
for breaking changes" rule. So I just set it to 0
and never change it. The remaining 3 components then follow Semver.
So for any of my packages, you can interpret versions as: 0.Major.Minor.Patch
Good question!
Based on https://pvp.haskell.org/, you technically cannot:
And https://pvp.haskell.org/faq/#semver,
My (perhaps disappointing) answer to this is that I just never do it 🤷.
Any "pre-release" periods I've needed have always been during initial development, where I choose SemVer's "nothing matters if you're pre 1.0" guide. If I want to do any pre-release testing after that, I usually add the release branch as a
git
dependency into test projects. I've never released a pre-release package for users.Again in https://pvp.haskell.org/faq/#semver,
I depart from PVP here and I will not hold myself to compatibility bumps in releases until I reach a
0.1.0.0
version, which I consider "1.0" in SemVer's parlance. For example,0.0.0.1 -> 0.0.1.0
may include a breaking change in one of my packages. That said, I don't hesitate greatly in getting to 1.0, so this period is typically short and I (or my team) is usually the only user of the package during that time.Looking over https://pvp.haskell.org/faq/#semver, I would probably amend this bit from the gist:
The examples they give are good ones, that I have and would use this component for myself:
It just so happens I rarely do this in practice, so most of my packages will sit at
0.
.