キャレット範囲 (^) — その仕組み

セマンティックバージョニングにおけるキャレット(^)範囲を理解します。^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.018.2.118.99.99はすべて有効ですが、19.0.0は対象外です。

エッジケース:0.xバージョン

1.0.0未満のバージョンでは、SemVerが0.x範囲を不安定と見なすため、キャレットはより制限的になります。^0.2.30.2.xの変更のみを許可し、0.3.0は許可しません。

ユースケース

npmまたはyarnで依存関係をインストールする際、ほぼすべてのNode.jsプロジェクトのpackage.jsonで使用されます。キャレット範囲の理解は、依存関係の更新を安全に管理するために不可欠です。

試してみる — Semver Calculator

フルツールを開く