概要
業務でパッケージのバージョン管理に関するタスクを担当した際、package.json
に記載されている ^
や ~
、>=
などの記号の違いによって、依存ライブラリの更新範囲が大きく変わることに気づきました。
特にバージョンの追従方針を決める際に、どの記号を使うべきか? がチームの安定運用にも関わるため、改めて整理しておきたいと思い調査それぞれの記号が持つ意味や使い分け、どのようなシーンで使うとよいかを、初心者にもわかりやすく解説しています。
package.json / Gemfile のバージョン指定とは
Node.js や React など、JavaScriptのプロジェクトでは、package.json
に依存パッケージのバージョンを記載します。
( Rubyでは Gemfile )
そのときに使われるのが ^
や ~
、>=
などの バージョン指定記号。
よく使うバージョン指定記号と意味
記号 | 意味(ざっくり) | 例 |
---|---|---|
^ |
同じメジャーバージョンで更新OK |
^1.2.3 → ~1.9.9 までOK |
~ |
同じマイナーバージョンで更新OK |
~1.2.3 → 1.2.x までOK |
>= |
指定バージョン以上ならなんでもOK |
>=1.2.3 → 1.2.3 〜∞
|
< |
指定バージョンより下ならOK |
<2.0.0 → 1.x.x まで |
* |
全てのバージョンOK(非推奨) |
* → どのバージョンでもOK |
バージョン指定記号の使い方と注意点
^
(キャレット)
- 使いどころ:基本的にこれでOK!
- 例:
^1.2.3
は1.2.3
以上2.0.0
未満 - メリット:破壊的変更(メジャー変更)を防ぎつつ、自動更新できる
- よく使われるケース:安定しているライブラリの導入時
~
(チルダ)
- 使いどころ:より慎重にマイナーだけ更新したいとき
- 例:
~1.2.3
は1.2.3
以上1.3.0
未満 - メリット:バグ修正だけを受け取れる
- よく使われるケース:ライブラリの挙動が微妙に違う場合など、更新を最小限にしたいとき
>=
(以上)
- 使いどころ:とにかく新しいバージョンに追従したいとき
- 例:
>=1.2.3
は1.2.3
以上すべて許可 - 注意:破壊的変更が入る可能性があるので本番環境では注意!
- よく使われるケース:個人開発や常に最新がいいとき
記号によるインストール結果の違い
// 例: "axios": "^1.2.3"
npm install のたびに 1.2.x 〜 1.x.x の最新版を取得
// 例: "axios": "~1.2.3"
1.2.x の最新版のみ取得(1.3.0 にはならない)
// 例: "axios": ">=1.2.3"
将来の 2.0.0 でも入る可能性がある(動作確認が必要)
推奨する使い方
シーン | おすすめ記号 |
---|---|
ライブラリの通常インストール |
^ (推奨) |
バージョン違いによるバグを防ぎたい |
~ (慎重) |
個人開発や最新を追いたい |
>= (上級者) |
会社やチーム開発で安定運用したい |
^ (基本) |
補足: 固定したいなら
"axios": "1.2.3"
とすれば、完全にそのバージョンだけ を使います。
CIの再現性など、環境を完全に固定したいときに有効です。
さいごに
「なぜ自分の環境で動かないのか?」を調べるときに、バージョンの指定の仕方が原因ということは意外と多いです。
バージョン管理は地味だけど、開発を安定させる超大事な知識になることを保守業務でとても勉強になりました。