Semver計算機 - セマンティックバージョンの解析・比較・テスト オンライン
セマンティックバージョニング文字列を解析、比較、ソートし、npm形式のレンジに対してテストします。キャレット、チルダ、ワイルドカード、ORレンジをサポート — 100%クライアントサイド、データはサーバーに送信されません。
よくある質問
セマンティックバージョニング(SemVer)とは何ですか?
セマンティックバージョニングは、MAJOR.MINOR.PATCHの3部分からなるバージョニング標準です。MAJORは後方互換性のない変更、MINORは後方互換性のある新機能、PATCHは後方互換性のあるバグ修正で増加します。SemVer 2.0.0仕様で定義され、npm、PyPI、Cargo、Goモジュールなどほぼすべてのパッケージエコシステムで使用されています。
このsemver計算機ツールはどのように使いますか?
ニーズに応じて4つのタブから選択してください:(1) 比較 — 2つのバージョンを入力して大小を確認、(2) レンジチェック — バージョンとnpmスタイルのレンジを入力してテスト、(3) ソート — 複数のバージョンを貼り付けて優先順位でソート、(4) バンプ — バージョンを入力して次のmajor、minor、patch、pre-releaseバージョンを確認。
バージョンデータは安全ですか?サーバーに送信されますか?
すべての解析、比較、レンジチェックは、ブラウザ内でJavaScriptを使用して100%クライアントサイドで実行されます。データはサーバーに送信されません。npmレジストリにクエリを送る他のツールとは異なり、完全にオフラインで動作します。
キャレット(^)とチルダ(~)レンジの違いは何ですか?
キャレット(^)レンジは最左の非ゼロ桁を変更しない変更を許可します:^1.2.3は>=1.2.3 <2.0.0を意味します。チルダ(~)レンジはパッチレベルの変更のみ許可します:~1.2.3は>=1.2.3 <1.3.0を意味します。0.xバージョンの場合、キャレットはより制限的に動作します:^0.2.3は>=0.2.3 <0.3.0を意味します。
SemVerはプレリリースバージョンをどのように扱いますか?
プレリリースバージョンはハイフンで追加されます(例:1.0.0-alpha、1.0.0-beta.1)。通常バージョンより低い優先順位を持つため、1.0.0-alpha < 1.0.0です。識別子は左から右に比較され、数値は整数として、英数字は辞書順で比較されます。
ビルドメタデータとは何ですか?バージョン比較に影響しますか?
ビルドメタデータはプラス記号で追加されます(例:1.0.0+build.123)。SemVer 2.0.0仕様により、ビルドメタデータはバージョン優先順位の決定時に無視されなければなりません。つまり、1.0.0+build.1と1.0.0+build.999は同じ優先順位とみなされます。
一度に複数のバージョンをテストできますか?
はい。レンジチェックタブでバッチモードを有効にすると、複数のバージョンを1行に1つずつ入力できます。ツールは各バージョンをレンジ式に対してテストし、色分けされた結果を表示します。
コード例
// Semantic Versioning Parser & Comparator
function parseSemVer(version) {
const match = version.trim().match(
/^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([\w.]+))?(?:\+([\w.]+))?$/
);
if (!match) return null;
return {
major: parseInt(match[1], 10),
minor: parseInt(match[2], 10),
patch: parseInt(match[3], 10),
prerelease: match[4]
? match[4].split('.').map(id => /^\d+$/.test(id) ? parseInt(id, 10) : id)
: [],
build: match[5] ? match[5].split('.') : [],
};
}
function compareSemVer(a, b) {
for (const key of ['major', 'minor', 'patch']) {
if (a[key] > b[key]) return 1;
if (a[key] < b[key]) return -1;
}
if (a.prerelease.length > 0 && b.prerelease.length === 0) return -1;
if (a.prerelease.length === 0 && b.prerelease.length > 0) return 1;
const len = Math.max(a.prerelease.length, b.prerelease.length);
for (let i = 0; i < len; i++) {
if (i >= a.prerelease.length) return -1;
if (i >= b.prerelease.length) return 1;
const ai = a.prerelease[i], bi = b.prerelease[i];
if (ai === bi) continue;
if (typeof ai === 'number' && typeof bi === 'number') return ai < bi ? -1 : 1;
if (typeof ai === 'number') return -1;
if (typeof bi === 'number') return 1;
return ai < bi ? -1 : 1;
}
return 0;
}
function sortVersions(versions, ascending = true) {
return versions
.map(v => ({ raw: v, parsed: parseSemVer(v) }))
.filter(v => v.parsed !== null)
.sort((a, b) => compareSemVer(a.parsed, b.parsed) * (ascending ? 1 : -1))
.map(v => v.raw);
}
// Example
const versions = ['2.0.0', '1.0.0-alpha', '1.0.0', '1.2.3', '0.9.0'];
console.log('Sorted:', sortVersions(versions));
// ['0.9.0', '1.0.0-alpha', '1.0.0', '1.2.3', '2.0.0']