SemVer バージョン比較ツール|2 つのバージョンの優先順位を SemVer 2.0.0 準拠で厳密判定
2 つのバージョン文字列を SemVer 2.0.0 仕様でパースし、major / minor / patch / プレリリース / ビルドメタに分解した上で、どちらが新しいかを厳密に判定。1.2.3 と 1.10.0-rc.1 のような直感に反する大小関係も記号と分解表示で透明化。
💡 このツールについて
バージョン番号の比較は、見た目の文字列順では正しく行えません。1.9.0 と 1.10.0 を文字列として比べると 9 の方が 1 より大きく見えてしまいますが、SemVer ではマイナー番号を数値として比較するため 1.10.0 の方が新しい、が正解です。この「9 と 10 の罠」は依存関係の更新可否やロックファイルの差分確認でつまずきやすいポイントです。
このツールは入力した 2 つのバージョンをその場でパースし、major / minor / patch をそれぞれ数値として比較し、プレリリース識別子の優先順位ルールまで適用した結果を A < B / A = B / A > B の記号で返します。各バージョンの構成要素を縦に分解表示するので、なぜその判定になったのかが一目で追えます。ビルドメタデータ(+ 以降)は SemVer 仕様上、優先順位の比較には含まれません。その挙動も分解カードで確認できます。
🧐 よくある質問
Q. 1.0.0-alpha と 1.0.0 はどちらが新しいですか?
A. 1.0.0(プレリリース無し)の方が新しいです。SemVer ではプレリリース版は同じ major.minor.patch の正式版より「前」に来ます。
Q. 1.0.0-alpha.1 と 1.0.0-alpha.beta の比較は?
A. 識別子をドットで分割し、左から順に比較します。数値同士は数値として、文字列を含む場合は ASCII 順で比較し、数値だけの識別子は文字を含む識別子より小さく扱われます。
Q. ビルドメタデータが違うだけのバージョンは別物として扱われますか?
A. いいえ。1.0.0+build.1 と 1.0.0+build.999 は SemVer 上の優先順位では同等(A = B)です。ビルドメタは比較対象外です。
Q. v1.2.3 のように先頭に v が付いていても判定できますか?
A. 先頭の v V = は除去してからパースするので問題ありません。ただし内部表現としての SemVer 2.0.0 形式(MAJOR.MINOR.PATCH)が必要です。
Q. 1.2 や 1 のように桁が足りない文字列は?
A. SemVer 2.0.0 は major.minor.patch の 3 桁を必須とするため、1.2 は不正な入力として扱われます。1.2.0 のように補って入力してください。
📚 セマンティックバージョニングの背景
SemVer(Semantic Versioning)は、GitHub 共同創業者の Tom Preston-Werner が提唱したバージョン番号の付け方の規約で、MAJOR.MINOR.PATCH の 3 つの数字に意味を持たせます。互換性を壊す変更で MAJOR、後方互換のある機能追加で MINOR、後方互換のバグ修正で PATCH を上げる、というルールです。npm や Cargo など多くのパッケージマネージャがこの規約を前提に依存解決を行っています。
国内開発の現場でも、ライブラリのアップグレード時に「この更新はメジャーバージョンが上がっているから破壊的変更かもしれない」と判断する材料として SemVer は浸透しています。プレリリース識別子(-rc.1 -beta など)の優先順位ルールは仕様書を読まないと正確に把握しづらい部分なので、迷ったときに 2 つを並べて確かめるのに役立ちます。