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つに分かれています。
上から順に変更内容が大きくなります。一番下のパッチはコードを少し修正しましたという内容です。
メジャーバージョンの変更はかなり大掛かりな変更です。これまでのコード内容では正常に動かずバグが発生する可能性が非常に高いです。
マイナーバージョンの変更は新たな機能が加わったなど、メジャーほど大きくない仕様の変更が一般的です。
パッチのバージョン更新は、バグを修正したなどの小修正が一般的です。
バージョンは以下のように表示されます。
メジャー.マイナー.パッチ
例えば、「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": ""
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」以下の範囲なら更新すると言う意味です。
参考リンク
バージョンの指定方法の詳細はnpmの公式ページで確認できます。