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
Yeah, that's quite annoying.
The thing is I like to have automated deployments for every commits I push to my default branch, and I make my work available as soon as possible, even if it is not "stable" yet. I believe it is an invaluable way to get good and early feedback about the API. It also save me from asking myself "when do I release? should I release?". I always release everything, every commit. So the only remaining choice I have to make is: "what is the stability I want to communicate to my users".
Sadly that doesn't seem possible with PVP :-/
That's an understandable point of view, but it is important to realize that a breaking change when going from
0.0.1.0
to0.0.2.0
is technically not PVP compliant. So I am not sure weather I'd allow myself to follow the same pattern :-(.I guess the only thing I can do is follow the
0.MAJOR.MINOR.PATCH
convention, and publish everything as stable, even if it is not... I guess that it is not possible to do better in Haskell. Quite a shame.I am not sure how good they are. To me they sound like an excuse to not change for semver. At least from my point of view they are not good enough to justify the usage of a language specific versioning scheme (that does not support pre-release concept) rather than following semver.
And actually the very fact that they give multiple different usages of the first major member is a sign that is is not good. It means it will always have different meaning depending on the library and it is open to interpretation. The goal of any versioning specification is to eliminate room for subjective interpretation.
Thanks for taking the time to respond with so much details and sources.
Last question, in your git repository, do you create tag after semver or PVP version? In other words, do your tags contain the leading
0.
?