セマンティックバージョニング (semver)
別名: semver / Semantic Versioning / セマンティックバージョン / バージョンレンジ
バージョン番号を「メジャー.マイナー.パッチ」の 3 つに分け、互換性を壊す変更・後方互換の機能追加・バグ修正のどれかに応じて上げる桁を決める規約。
npm の ^ や ~ はこれを前提に更新範囲を決める。
公開:
定義
セマンティックバージョニング(semver)は、バージョン番号を MAJOR.MINOR.PATCH の 3 つの数字で表し、変更の種類に応じて上げる桁を決める規約である。
互換性のない API 変更ならメジャー、後方互換な機能追加ならマイナー、後方互換なバグ修正ならパッチを上げる。npm をはじめ、多くのパッケージ管理ツールがこの前提でバージョンを扱う。
詳細
package.json の依存には、固定のバージョンではなく範囲(レンジ)を書くのが普通である。
npm はパッケージを保存するとき既定で ^ を付ける。^1.2.3 は 1.2.3 以上 2.0.0 未満、~1.2.3 は 1.2.3 以上 1.3.0 未満を表す。npm update はこの範囲内の最新までしか上げないため、メジャーバージョンは越えない(npm update でメジャーバージョンに更新できない)。
peerDependencies の react@^18 のような指定も同じ読み方で、複数の依存が求める範囲が重ならないと依存解決が失敗する。
よくある誤解
^は常に最新版を入れる:^が許すのは、一番左にある 0 でない桁を変えない範囲である。
そのため^0.2.3は 0.3.0 未満に限られ、0.x のパッケージではマイナー更新すら入らない。- マイナー更新なら壊れない: semver は公開者が守る約束であり、ツールが互換性を検査しているわけではない。
また 0.y.z は初期開発用とされ、いつどんな変更が入ってもよい。
関連
レンジの範囲内で実際に入ったバージョンを固定するのは Lockfile の役割である。
プラグインなどが本体に求めるバージョン範囲は peerDependencies で宣言され、衝突すると npm install が「ERESOLVE unable to resolve dependency tree」で失敗する ことになる。