GitHub上ではv
をつけるのが一般的らしい。だが、それは無効なセマンティックバージョニングである。GitHubでSemVerを運用するにはどうすればいい?
情報源
背景
- PyPIにパッケージを登録して
pip install
できるようにしたい - GitHubからダウンロードさせることでGitHubAPIからダウンロード数を取得したい
- ダウンロードリンクを作成するには、GitHubのrelease機能を使う
- release機能は
git tag
コマンドで作る git tag
におけるバージョン値はプレフィクスv
をつけるのが一般的(例:v1.0.0
)v
プレフィクスがついたものは無効なセマンティックバージョニングである
問題
GitHubでSemVerを運用するにはどうすればいい? プレフィクスv
はつけるべきか否か?
結論
GitHubの文脈ではセマンティックバージョニング(SemVer)を運用できない。ただし、v1.0.0
形式で擬似的に運用していると思われる。
GitHubのタグではプレフィクスv
をつけるべき。そのあとにSemVer値を加えたタグ文字列をもって、擬似的にSemVerとして運用する。
問題
バージョンを正しく大小比較できない。原因はGitHubのタグが文字列であるせい。
- 期待値:
v1.2 < v1.11
- 実際値:
v1.2 > v1.11
これは数値比較か文字列比較かによる差異である。「期待値」のように数値比較して欲しいのだが、実際のデータは文字列であるため文字列比較されてしまう。結果、4文字目の1
より2
のほうが大きいため「実際値」の結果となってしまう。
解決不能
これはGitHubのタグ機能における仕様であるため解決不能……。
0
埋めすればいいという妥協案もありそうだが、それはSemVerの仕様から外れてしまうため不可。
一般的な慣習を破れば?
もちろん可能。ただ、GitHubのタグはあくまで単なる文字列である。バージョン以外のタグ文字列をつけることもできる。そんな中でバージョン用タグを抽出するためにはプレフィクスv
を付与したほうが見つけやすい。
つまり、あくまでタグ機能を使ったバージョニングに過ぎない。バージョニング専用機能でないため、このような残念な結果になる。
Gitはリビジョン管理ツールなのに、バージョニングが文字列でしかできないってどうなの?
どうしてもこの疑問を禁じ得ない。だが理由はわかる。労力の割に価値がない。
バージョンの書き方なんて細かいことをいちいち定義するのも面倒だし、それを自動化まで考えると果てしなく大変。その割に得られる成果は小さい。1.0.0
のようなバージョン値文字列だけ。
環境ごとのバージョニングを考慮した結論
できるだけ各環境すべてにおける共通値を使うべき。そうするとプレリリース識別子は使わないほうが無難。たとえば1.0.0-alpha.1
などにある-alpha.1
のようなプレリリース識別子は使わないほうが無難。
0.0.1 # 正式版より前 0.1.0 # 正式版より前 1.0.0 # 正式版
ただ、非正式版のときは「公開APIが変わるとメジャー値をあげる」ルールが使えない。事実上、ルールがないようなもの。ビルド単位で適当にあげることになりそう。
GitHubのタグを使うときは上記のバージョン値にプレフィクスv
をつける。
対象環境
- Raspbierry pi 4 Model B
- Raspbian buster 10.0 2019-09-26 ※
- bash 5.0.3(1)-release
$ uname -a Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux