node の package.json とかで ~
とか ^
を見た時にどういう意味だかよく忘れるので備忘録がてら
ドキュメントは公式で詳しくまとまっているので見に行ってみると良いと思う。
Semantic Versioning (semver) のおさらい
Semantic versioning はバージョン管理の命名規則を標準化する事で、依存関係の定義や互換性の判断を簡単、正確に行えるようにしようという取り組み。
バージョンを3つのセクションで区切り、以下の意味付けをしている。
- Major: 後方互換性を保証しないバージョンアップ
- Minor: 後方互換性を保証した機能追加などのバージョンアップ
- Patch: 後方互換性を保証したバグの修正によるバージョンアップ
semver の範囲指定
npm では semver を使って依存関係を指定していて、そこで特殊な記号である特定の範囲を表してる。
~
: Patch Range Tilda Ranges
Major, Minor のバージョンは一致している必要があり、 Patch バージョンは指定したものよりも上であればOK
基本は Patch レベルでの互換性があればアップデートを許可するための書式として覚えればいい。
んだけど、続くバージョンの書き方で挙動が変わる難儀なやつ。
具体的には「Minor バージョン以下も記載している」ときと「Major バージョンのみを記載している」ときで変わる。
Minor バージョン以下も記載しているとき
Major, Minor のバージョンは一致している必要があり、 Patch バージョンは指定したものよりも上であればOK
Patch バージョンが省略されている場合は 0
とみなされるので、基本どんな Patch バージョンでも良くなる
Major バージョンのみを記載しているとき
Major バージョンのみを記載しているときはMinor バージョンも任意のバージョンにマッチするようになる。
つまりは Major のみ固定とみなされる。
^
: Major Range Caret Ranges
Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple.
一番最初の ゼロでないバージョンを固定する
Major バージョンが 0 でない場合は確かに Major バージョンを固定するが、0 だった場合は Minor バージョンを固定。さらに Minor バージョンも 0 だった場合、Patch バージョンが固定される。
Major バージョンから固定していこうとする意味では間違っていないが、 0 の時に特殊な挙動になるので注意。
Major のバージョンは一致している必要があり、 Minor のバージョンは指定したものよりも上であればOK
Minor レベルでのアップデートであれば許可するための書式
自分の理解していたような挙動じゃなかった時があったので確認してみたら、若干違った。。。
記号覚えるの辛い
ので、自分の中で名前を付けてあげると結構覚えやすくなるんじゃないかな。
自分で名前つけて覚えようとしてたけど、期待してたよりもトリッキーな挙動する←
いい線いってるとおもったんだけどなぁ〜
記号の場所で覚える
他の記事で書いたけど、
^
は上にあるので Major バージョン関係
~
は真ん中にあるので Minor バージョン関係
覚えるのは結構良いかもしれない。ざっくりだけど、案外これで覚えてたりする。