【npm】package.jsonのバージョン指定「^」キャレット、「~」チルダ、「*」アスタリスク、xとは何かを実例でわかりやすく解説|メジャー、マイナー、パッチ

npm-prograshi(プロぐらし)-kvNode-js

npmのpackage.json(あるいはpackage-lock.json)の中で、パッケージ名の後ろにバージョンの指定を見ることができます。

その場合、たいてい以下のようにバージョンの冒頭にチルダ「~」やキャレット「^」がついています。

  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-eslint": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "@vue/compiler-sfc": "^3.0.0",
    "babel-eslint": "^10.1.0",
    "eslint": "^6.7.2",
    "eslint-plugin-vue": "^7.0.0"
  },

これらの記述によってインストールされるパッケージのバージョンが異なります。

ここでは、バージョンの冒頭についているチルダ「~」やキャレット「^」や、「*」アスタリスク、「x」または「X」が何を意味しているかについてまとめています。


バージョンの基礎知識|メジャー、マイナー、パッチ

チルダ「~」やキャレット「^」などについて説明する前に、まずパッケージのバージョンの表示方法について理解しておく必要があります。

バージョンは以下の3つに分かれています。

バージョンの種類
  1. メジャーバージョン(major)
  2. マイナーバージョン(minor)
  3. パッチ

上から順に変更内容が大きくなります。一番下のパッチはコードを少し修正しましたという内容です。

メジャーバージョンの変更はかなり大掛かりな変更です。これまでのコード内容では正常に動かずバグが発生する可能性が非常に高いです。

マイナーバージョンの変更は新たな機能が加わったなど、メジャーほど大きくない仕様の変更が一般的です。

パッチのバージョン更新は、バグを修正したなどの小修正が一般的です。

バージョンは以下のように表示されます。

メジャー.マイナー.パッチ

例えば、「4.6.3」という記述の場合、

  • メジャーバージョンは「4」
  • マイナーバージョンは「6」
  • パッチのバージョンは「3」

となります。


チルダ「~」の意味

チルダ「~」は一番末尾のバージョンに変更があるパッケージがあった場合のみ更新するという意味です。

このため、次の2つの状態で、どこまで更新するかが変わります。

チルダ「~」で更新対象となるバージョン
  • マイナーバージョンが記載されている場合。
  • マイナーバージョンが記載されていない場合(メジャーバージョンの指定しかない場合)


マイナーバージョンが記載されている場合

マイナーバージョンが記載されている場合のチルダ「~」はパッチのバージョンで新しいバージョンをがあれば更新するという内容です。

例えば、「~1.2.3」という記述があれば、もしバージョン「1.2.5」「1.2.7」というバージョンがあれば更新します。

一方、「2.0」「2.1.3」「3.2」というようにメジャーバージョンが違うものや、「1.3.0」「1.5.2」というようにマイナーバージョンが異なる場合はパッケージを更新しません。

つまり「~1.1.2」 は「 1.1.2 <= version < 1.2.0 」ということです。1.1.2以上のバージョンで1.2.0未満のバージョンなら更新するという意味になります。


マイナーバージョンが記載されていない場合

マイナーバージョンが記載されていない場合のチルダ「~」はマイナーとパッチので新しいバージョンをがあれば更新するという内容です。

例えば、「~1」という記述があれば、もしバージョン「1.2」「1.3.7」というバージョンがあれば更新します。

一方、「2.0」「2.1」「2.3.5」「3.2」というようにメジャーバージョンが異なる場合はパッケージを更新しません。

つまり「~2」 は「 2.0 <= version < 3.0 」ということです。2.0以上のバージョンで3.0未満のバージョンなら更新するという意味になります。

Allows patch-level changes if a minor version is specified on the comparator. Allows minor-level changes if not.

マイナーバージョンが指定されている場合、パッチレベルの変更を許可します。そうでない場合は、マイナーレベルの変更を許可します。

(参考)npm公式ページ:https://www.npmjs.com/package/semver/v/4.3.6


キャレット(^)

キャレット(^)はゼロを除く、一番左端のバージョンは固定して、それ以外のバージョンで新しいものがあれば更新します。


メジャーバージョンがゼロ以外の場合

「^2」「^3.2」「^4.0.0」などメジャーバージョンが0以外の場合は、メジャーバージョンを固定して、マイナーとパッチのバージョンのみ更新します。

例えば、「^2」なら、2.0.0以上、3.0.0未満のバージョンを許容します(3.0.0は許容しません)

「^2.1」も同じく2.0.0以上、3.0.0未満のバージョンを許容します(3.0.0は許容しません)

「^2.1.3」も同じく2.0.0以上、3.0.0未満のバージョンを許容します(3.0.0は許容しません)


メジャーバージョンがゼロの場合

「^0.2.3」や「^0.3」などメジャーバージョンがゼロの場合は、マイナーバージョンの値を固定し、パッチのバージョンのみを更新します。

例えば「^0.2.3」であれば、「0.2.0」以上、「0.3.0」未満となります。

例えば「^0.3」であれば、「0.3.0」以上、「0.4.0」未満となります。

Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple.

[メジャー.マイナー.パッチ]の指定において、ゼロを除く一番左端の数字の変更を許可します。

(参考)npm公式ページ:https://www.npmjs.com/package/semver/v/4.3.6


全てのバージョンを許可する(*アスタリスク)

メジャーやマイナー、パッチなどを指定せず、新しいバージョンが出たらそれに変更するようにしたい場合は、「*」アスタリスクを使います。

1.2.*
*


実例

"vue": *

上記の場合、npm installを実行したときにパッケージに新しいものがあれば、メジャーバージョンが変わっていたとしても更新します。

なお、空文字を指定した場合も「*」と同じ処理になります。

"vue": ""
point

メジャーバージョンが変わると、処理や記述が大きく変更になり、これまでのコードで動かなくなる可能性が高いので、「*」のみや「空文字」で指定することはめったにありません。


xを使って指定する

マイナー、メジャー、パッチの特定の部分が変わった場合に更新を許可したい場合は「x」を使って指定することができます。

xは大文字でも小文字でもどちらでも使えます。

メジャーバージョンの更新を許可することはほとんどないので、マイナーとパッチのバージョンのどちらかに指定します。

マイナーとパッチのバージョン更新を許可する

マイナーとパッチのバージョン更新を許可する場合は、「1.x」や「2.x」というように記述します。

例えば「2.x」であれば「2.0.0」以上、「3.0.0」未満のバージョンがあれば更新するという処理になります。


パッチのバージョン更新を許可する

パッチのバージョン更新を許可する場合は、「1.2.x」や「2.4.x」というように記述します。

例えば「2.4.x」であれば「2.4.0」以上、「2.5.0」未満のバージョンがあれば更新するという処理になります。


更新可能な範囲を数値で指定する

なお、「^」「~」「x」などの記号を使わずに、バージョンを数値で指定することもできます。

X.Y.Z - A.B.C


実例

1.2.3 - 2.3.4

これは、バージョンが「1.2.3」以上、「2.3.4」以下の範囲なら更新すると言う意味です。


1.2 - 2.3.4

これは、バージョンが「1.2.0」以上、「2.3.4」以下の範囲なら更新すると言う意味です。


1.2 - 3

これは、バージョンが「1.2.0」以上、「4.0.0」以下の範囲なら更新すると言う意味です。

注意点

右側のバージョンの指定がメジャーのみの場合、そのメジャーバージョンは全て更新対象となります。

例「4」なら、「4.x.x」は全て含む。5.0.0以上は含まない。


参考リンク

バージョンの指定方法の詳細はnpmの公式ページで確認できます。

semver
The semantic version parser used by npm.
タイトルとURLをコピーしました