Semverルールでバージョンリストをソート

セマンティックバージョンのリストを正しい順序でソートします。辞書順ソートがバージョンで失敗する理由とsemver比較が正しい結果を出す仕組みを解説。

Version Comparison

詳細な説明

Semverルールによるバージョンソート

バージョン文字列をアルファベット順にソートすると間違った結果になります。正しい順序を得るにはSemVer対応のソートが必要です。

辞書順ソートが失敗する理由

辞書順ソート Semverソート
1.1.0 1.1.0
1.10.0 1.2.0
1.2.0 1.10.0
1.9.0 1.9.0

辞書順比較はバージョンコンポーネントを文字として扱うため、"10""2"の前に来ます('1' < '2'のため)。Semver比較は整数として扱うため、10 > 2です。

正しいソートアルゴリズム

semverバージョンリストをソートするには:

  1. 各文字列を(major, minor, patch, prerelease)タプルにパース
  2. major(整数)、次にminor(整数)、次にpatch(整数)でソート
  3. プレリリースのないバージョンは同番号のプレリリースバージョンの
  4. プレリリースバージョンは識別子比較ルールで比較

ソート例

ランダム順の以下のバージョン:

2.0.0, 1.0.0-alpha, 1.0.0, 1.0.0-rc.1, 0.9.0, 1.0.0-beta.2, 1.1.0

正しいsemverソート(昇順):

0.9.0
1.0.0-alpha
1.0.0-beta.2
1.0.0-rc.1
1.0.0
1.1.0
2.0.0

実用的なアプリケーション

ユースケース
チェンジログの順序付け リリースを新しい順に表示
最新バージョン検出 リスト内で最もバージョンが高いものを見つける
バージョン範囲フィルタリング ^1.0.0にマッチするすべてのバージョンを表示
レジストリブラウジング パッケージの公開バージョンをソート

ユースケース

リリースダッシュボード、チェンジログジェネレーター、またはバージョンをアルファベット順ではなく正しい順序で表示する必要があるパッケージレジストリUIの構築。

試してみる — Semver Calculator

フルツールを開く