キャレット範囲 (^) — その仕組み
セマンティックバージョニングにおけるキャレット(^)範囲を理解します。^1.2.3が>=1.2.3 <2.0.0に展開される仕組みと、npmのデフォルトである理由を解説します。
Caret Ranges
詳細な説明
キャレット範囲 (^) の理解
キャレット範囲は、npmエコシステムで最もよく使われる範囲演算子です。npm installを実行すると、デフォルトでキャレットがpackage.jsonに追加されます。
キャレットの仕組み
^MAJOR.MINOR.PATCHは、最も左の非ゼロ桁を変更しない変更を許可します:
| 範囲 | 展開形 | 意味 |
|---|---|---|
^1.2.3 |
>=1.2.3 <2.0.0 |
1.2.3以上の任意の1.x.x |
^0.2.3 |
>=0.2.3 <0.3.0 |
0.2.3以上の0.2.xのみ |
^0.0.3 |
>=0.0.3 <0.0.4 |
正確に0.0.3のみ |
キャレットがデフォルトである理由
キャレット範囲は、マイナーとパッチの更新は後方互換性があると想定しています。これはSemVer仕様に沿っています。バグ修正と新機能を取得しつつ、破壊的なメジャーバージョン変更から保護されます。
実際のパッケージでの例
package.jsonに以下がある場合:
{
"dependencies": {
"react": "^18.2.0"
}
}
npmは18.2.0から19.0.0未満の任意のReactバージョンをインストールします。18.3.0、18.2.1、18.99.99はすべて有効ですが、19.0.0は対象外です。
エッジケース:0.xバージョン
1.0.0未満のバージョンでは、SemVerが0.x範囲を不安定と見なすため、キャレットはより制限的になります。^0.2.3は0.2.xの変更のみを許可し、0.3.0は許可しません。
ユースケース
npmまたはyarnで依存関係をインストールする際、ほぼすべてのNode.jsプロジェクトのpackage.jsonで使用されます。キャレット範囲の理解は、依存関係の更新を安全に管理するために不可欠です。