TL;DR
バージョン番号を MAJOR.MINOR.PATCH の 3 つの数字で表し、変更が後方互換性を保つかどうかで上げる位置を決める規約である。
なぜ必要か
依存関係の指定が厳しすぎると、依存先をすべて更新しない限り自分も更新できなくなる。逆に緩すぎると、どのバージョンと互換性があるのか読めなくなる。セマンティックバージョニングは、バージョン番号に明確な意味を持たせることで、この「依存関係地獄」を避けることを目指している。
仕組み
- MAJOR: パブリック API に後方互換性のない変更を加えたときに上げる。MINOR と PATCH は 0 に戻す
- MINOR: 後方互換性を保ったまま機能を追加したときに上げる。PATCH は 0 に戻す
- PATCH: 後方互換性を保ったままバグを修正したときに上げる
注意点
API を変えない些細な変更でも、以前の挙動に依存している利用者がいれば壊れることがある(Hyrum の法則)。「互換性を保った変更」かどうかの判断は、見た目ほど単純ではない。