提供する機能とは関係なくリリースを定期的に実施するようなプロダクトや、バージョンにSemantic Versioning(以下SemVer)のような意味付けがしにくいプロダクトの場合、バージョン管理手法にCalendar Versioning(以下、CalVer)というものが採用されることがあります。
例えば、CalVerのサイトに掲載されているケーススタディで私が知っていたものとしてはUbuntuのバージョニング( YY.0M.MICRO
)があります。 22.04
とか 22.10
とかのアレです。
そしてちょうど私がバージョニングしたいプロダクトも
- 1ヶ月に1度定期的にリリースしたい
- しかし、なにかしらの要因で1ヶ月に1度以上リリースすることがある
というものでSemVerではない気がするし、とは言え単純に 年月
でバージョニングすると同月リリースがあるとバージョンがかぶることがあるということでCalVerを採用することにしました。
そして、CalVerを操作するパッケージやツールを探したのですが微妙に用途にあわなかったため、車輪の再発明ですが作りました。
calver
calver
はGoのパッケージでありツールであるのですが、多くはツールとしての利用することが多いと思うのでツールとしての calver
の紹介をします。
CalVerのバージョンの管理方式は1つではありません。なので calver
ではまずバージョンレイアウトを指定します。
$ date Mon May 15 13:01:27 UTC 2023 $ calver --layout YYYY.0M.MICRO 2023.05.0 $ calver --layout YY.MM 23.5
指定できるパーツはCalVerのSchemaの項に掲載されているものが使用できます。
次のバージョン
そしてCalVerの特徴的なものが「次のバージョン」です。
レイアウトが YYYY.MM.MICRO
、 カレントバージョンが 2023.4.0
、現在の日付が2023年4月だった場合、次のバージョンは 2023.4.1
になります。
ところが、レイアウトが YYYY.MM.MICRO
、 カレントバージョンが 2023.4.0
、現在の日付が2023年5月だった場合、次のバージョンは 2023.5.0
になります。
日付表記のバージョンが被った場合のみ、数値バージョンの部分がインクリメントされるのです。
calver
では対象となるバージョンと --next
オプションを付与することで次バージョンを計算できます。
$ date Tue May 9 13:04:09 UTC 2023 $ calver --layout YY.0M.MICRO 23.5.0 # 対象となるバージョンを標準入力もしくは引数で与えることができる $ calver --layout YY.0M.MICRO | calver --layout YY.0M.MICRO --next 23.5.1
最新のバージョン
「次のバージョン」の元となるバージョンは「最新のバージョン」です。
calver
は標準入力もしくは引数で複数のバージョンを与えると、最新のバージョンを取得し表示します。また、その中に指定のレイアウトに合致しないバージョン文字列があっても無視します。
具体的には次のようにバージョニングされたリリース群に対して使うことを想定しています。
$ date Tue May 9 13:04:09 UTC 2023 $ gh release list | cut -f 1 v1.1.2 v1.1.1 2023.05.1 2023.05.0 v1.1.0 v1.0.1 2023.03.1 2023.03.0 v1.0.0 2023.02.0 v0.1.0 $ gh release list | cut -f 1 | calver --layout YY.0M.MICRO 2023.05.1 $ gh release list | cut -f 1 | calver --layout YY.0M.MICRO --next 2023.05.2
--trim-suffix
UbuntuのCalVerのレイアウトは YY.0M.MICRO
らしいです。ただし、 MICRO
バージョンが 0
の場合は末尾の .0
が省略されます。
それを実現するオプションとして --trim-suffix
を用意しています。
$ date Tue May 9 13:04:09 UTC 2023 $ calver --layout YY.0M.MICRO --trim-suffix 2023.05 $ calver --layout YY.0M.MICRO --trim-suffix | calver --layout YY.0M.MICRO --trim-suffix --next 2023.05.1
MODIFIER
バージョンを特別に扱ったりなど、かなり用途に沿った実装をしたつもりです。
というわけで
もしCalVerを使う機会がありましたらcalverを検討してみてください。