AIでバージョン番号を比較する方法|SemVerの優先順位と同順位を確認

架空7件をSemVerで比較。1.9と1.10、プレリリースの数値、ビルドだけ違う同順位を検算し、導入判断と分けます。

AIものさし編集部

AIにバージョン一覧を並べさせるときは、文字列の並び順と、製品が採用するバージョン規則を分けます。1.10.0と1.9.0を小数や文字列として比較すると、更新候補の順序を取り違えます。比較結果だけから、互換性や導入可否を決めることもできません。

この記事は、Semantic Versioning 2.0.0を使うという説明用の条件で、架空の7件を比較します。既存ライブラリの比較関数でローカル検算しましたが、パッケージの取得、更新、依存解決、実アプリの動作は行っていません。

最初に、製品のバージョン規則を確認する

数字がドットで区切られているだけでは、SemVerを採用していると決まりません。製品のリリース規則を確かめ、日付形式、独自のリビジョン、別のパッケージ管理規則を混ぜないようにします。

今回の対象は、次の架空一覧です。現行製品の最新バージョンや、更新を勧める一覧ではありません。元の行IDは比較後も保持します。

表は横にスクロールできます

行IDバージョン
V011.9.0
V021.10.0-alpha.2
V031.10.0-alpha.10
V041.10.0-beta
V051.10.0-rc.1
V061.10.0+build.1
V071.10.0+build.2

SemVer 2.0.0の優先順位は、主要部を数値として比較し、同じ主要部ならプレリリースを通常版より低く扱います。ビルドメタデータは優先順位へ含めません。SemVer 2.0.0:仕様(新しいタブで開く)

以下の「低い・高い」は、この規則の優先順位を指します。公開日時、人気、品質、安全性の順位ではありません。

数字の各部分を比較し、小数へ変換しない

1.9.0の主要部は整数の組(1, 9, 0)、1.10.0は(1, 10, 0)です。左から最初に異なるminorの9と10を比較するので、1.9.0のほうが低くなります。

1.10を小数として1.1と同じ値にしたり、ドットを消して190と1100の大小で比べたりしません。各部分の桁数は一定とは限らず、文字列全体の並べ替えも代用になりません。

例えば文字列の昇順では、先頭が1.10.0の行が1.9.0より先に来ます。今回のSemVer条件ではV01が先です。並び順を直す前に、どの比較規則を使った結果なのかを明記します。

プレリリースとビルドを別の欄として読む

V02とV03は主要部が同じで、プレリリースのalphaも共通です。次の識別子2と10は数値なので2が先です。文字列の10が2より先に来る並べ方ではありません。

V03とV04はalphaとbetaを、V04とV05はbetaとrcを比較します。この例ではASCIIの文字列比較でもalpha、beta、rcの順になります。「alphaだから常に特別に最小」という独自の順位表へ置き換えないようにします。

V06とV07にはプレリリースがなく、主要部が同じ通常版です。プラス以降のbuild.1とbuild.2はビルドメタデータなので、優先順位は同じです。同順位であっても文字列や配布物が同一という意味ではなく、行を一つにまとめません。

比較結果は、同順位のグループで示す

今回の低い順の結果は次のとおりです。

表は横にスクロールできます

グループ行ID比較の根拠
1V01主要部のminorが9
2V02minorが10、alphaの数値識別子2
3V03alphaの数値識別子10
4V04プレリリースのbeta
5V05プレリリースのrc.1
6V06、V07同じ通常版。ビルドの違いは優先順位へ含めない

式で表すとV01 < V02 < V03 < V04 < V05 < V06で、V06とV07の優先順位は等しくなります。7行を6グループへ整理したもので、7行のうち1行を削除した結果ではありません。

一覧表示のために同順位内の並びを決めるなら、「入力順を維持」などの追加ルールを別に記録します。それをSemVerが定める優先順位の差として説明しないでください。

比較関数で例を検算する

次はsemverパッケージを利用できるNode.js環境で、掲載した比較を確認する例です。検算環境では既に存在するsemver 7.8.5を使いました。新たなパッケージ取得や、対象プロジェクトの依存更新はしていません。

const semver = require("semver");
const assert = require("node:assert/strict");

const rows = [
  { id: "V01", version: "1.9.0" },
  { id: "V02", version: "1.10.0-alpha.2" },
  { id: "V03", version: "1.10.0-alpha.10" },
  { id: "V04", version: "1.10.0-beta" },
  { id: "V05", version: "1.10.0-rc.1" },
  { id: "V06", version: "1.10.0+build.1" },
  { id: "V07", version: "1.10.0+build.2" },
];
for (let i = 0; i < 5; i++) {
  assert(semver.compare(rows[i].version, rows[i + 1].version) < 0);
}
assert.equal(semver.compare(rows[5].version, rows[6].version), 0);
const ordered = [...rows].sort((a, b) =>
  semver.compare(a.version, b.version)
);
assert.equal(ordered.length, 7);
assert.deepEqual(rows.map(r => r.id),
  ["V01", "V02", "V03", "V04", "V05", "V06", "V07"]);
console.log(ordered);

ここでは優先順位を比較するcompareを明示しています。node-semverにはビルドまで比べるcompareBuildもあり、同じ「並べ替え」でも目的に合う関数を選びます。node-semver公式:比較関数(新しいタブで開く)

このコードは掲載7件を比較する例です。任意入力の厳密な形式検証、すべてのSemVer境界例の適合検査、依存バージョン範囲の解決を実装したものではありません。

AIへは、優先順位と導入判断を分けて返させる

次の行ID付き一覧を、SemVer 2.0.0の優先順位で整理してください。
対象がSemVerを採用するという条件で比較します。
主要部を数値として扱い、プレリリースとビルドメタデータを分けてください。
同じ優先順位は同じグループにし、元行と元表記を保持してください。
出力:元ID、主要部、プレリリース、ビルド、比較グループ、根拠。
独自形式や解釈できない入力は勝手に補正せず、確認事項として分けてください。
公開日、互換性、安全性、更新推奨を番号の大小だけから推測しないでください。
コードを実行していない場合は、検算済みと書かないでください。
入力:[架空の一覧]。

実際の更新候補を選ぶときは、比較後にリリースノート、対象環境、変更点、依存条件、テスト結果を別に確認します。通常版の優先順位が高いことから、自分の環境で動くことや、導入すべきことは証明できません。

日付、先頭のv、欠けたpatchなどを含む一覧では、製品の表記規則と比較ライブラリの受入仕様を確認します。この記事の7件へ整えるために、元表記を削ったり数字を補ったりする指示にはしません。

参考資料

公式資料の確認日:2026年10月20日。7件は架空の比較例です。ローカルで既存semver 7.8.5による比較を検査しました。AIサービス、依存更新、配布物の同一性、実アプリ、画面表示は未検証です。

質問から自分に合うAIを探す