AIにバージョン一覧を並べさせるときは、文字列の並び順と、製品が採用するバージョン規則を分けます。1.10.0と1.9.0を小数や文字列として比較すると、更新候補の順序を取り違えます。比較結果だけから、互換性や導入可否を決めることもできません。
この記事は、Semantic Versioning 2.0.0を使うという説明用の条件で、架空の7件を比較します。既存ライブラリの比較関数でローカル検算しましたが、パッケージの取得、更新、依存解決、実アプリの動作は行っていません。
目次
最初に、製品のバージョン規則を確認する
数字がドットで区切られているだけでは、SemVerを採用していると決まりません。製品のリリース規則を確かめ、日付形式、独自のリビジョン、別のパッケージ管理規則を混ぜないようにします。
今回の対象は、次の架空一覧です。現行製品の最新バージョンや、更新を勧める一覧ではありません。元の行IDは比較後も保持します。
表は横にスクロールできます
| 行ID | バージョン |
|---|---|
| V01 | 1.9.0 |
| V02 | 1.10.0-alpha.2 |
| V03 | 1.10.0-alpha.10 |
| V04 | 1.10.0-beta |
| V05 | 1.10.0-rc.1 |
| V06 | 1.10.0+build.1 |
| V07 | 1.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 | 比較の根拠 |
|---|---|---|
| 1 | V01 | 主要部のminorが9 |
| 2 | V02 | minorが10、alphaの数値識別子2 |
| 3 | V03 | alphaの数値識別子10 |
| 4 | V04 | プレリリースのbeta |
| 5 | V05 | プレリリースのrc.1 |
| 6 | V06、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サービス、依存更新、配布物の同一性、実アプリ、画面表示は未検証です。
