Calendar Versioning (CalVer) でバージョニングを行う
最近自分は本業で新規のプロダクトをやっていて、Semantic Versioning ではなく Calendar Versioning (以下 CalVer) を利用している。
前のプロダクトでは、Semantic Versioning で普通にやっていたのだけれど、ライブラリでも無い限り MAJOR
, MINOR
, PATCH
が正しく更新されず形骸化していくことに課題を持っていたことがきっかけ。
Semantic Versioning では多くの人がご存知の通り MAJOR.MINOR.PATCH
というフォーマットでそれぞれは以下のような場面でインクリメントされる
- MAJOR
: 破壊的な変更が行われ後方互換性を失ったとき
- MINOR
: 後方互換性のある形での機能追加
- PATCH
: 後方互換性のある形でのバグ修正
プロダクトにおける「破壊的な変更が行われ後方互換性を失ったとき」というのは、バックエンドでもフロントエンドでもまあまあ起こり得るものの、その際に MAJOR
をインクリメントせずとりあえずリリース作業に従って MINOR
をインクリメントしているという場面を見たことがある人は少なく無いんじゃ無いかと思う (もしかすると僕の周りだけかもしれないし、もしそういう場面を見たことがないのであればそれは素晴らしいことです)。
そこで自分は、新規のプロダクトのバージョン名の管理をするにあたって代替案がないか探してたところ CalVer を見つけた。
CalVer には、以下のフォーマットがありこれをある程度プロジェクトによって自由に組み合わせる形でバージョン名をつける (Semantic Versioning にあるものは引き続き利用可能としている)
- YYYY
- Full year - 2006, 2016, 2106
- YY
- Short year - 6, 16, 106
- 0Y
- Zero-padded year - 06, 16, 106
- MM
- Short month - 1, 2 … 11, 12
- 0M
- Zero-padded month - 01, 02 … 11, 12
- WW
- Short week (since start of year) - 1, 2, 33, 52
- 0W
- Zero-padded week - 01, 02, 33, 52
- DD
- Short day - 1, 2 … 30, 31
- 0D
- Zero-padded day - 01, 02 … 30, 31
CalVer - Case Studies には、例えば Ubuntu は、YY.0M.MICRO
( MICRO
は Semantic Versioning ように同一のバージョンの中で区別するために使われている様子) というフォーマットでバージョニングをしている模様。
紹介はされていなかったものの、それこそ IntelliJ - Other Versions を見ると YYYY.MM
でバージョニングしていると言えそう。
今のプロダクトでは、おおよそ定常的に週に2回リリースしているので YYYY.0M.0D.MICRO
で運用している。
今のところ不便はなくいつごろにリリースしたものかも明確なので困っていない。