🥕

package.jsonのキャレットをちゃんと理解する

2022/06/15に公開

package.jsonの ^ についてわかっているようでわかっていなかったので、今回記事にまとめてみました。

Caretについて

package.json でバージョン管理する際によくみるやつですね。^ みたいなやつです。以下に僕のnotion blogのpackage.jsonの一部を書いています。

"@zeit/react-jsx-parser": "^2.0.0",
"eslint-config-prettier": "^6.11.0",
"eslint-plugin-prettier": "^3.1.3",

これですね。

勘違いしていた.....

"eslint-plugin-prettier": "^3.1.3",

上記のeslint-plugin-prettier について例としてみていきたいと思います。自分はこの場合

^3.1.3 → 3.1.3を含むより上だけど0まで。つまり 3.2.0は含まれない。

と解釈していました。因みに全然違います。

公式参照

以下公式

https://docs.npmjs.com/cli/v6/using-npm/semver#caret-ranges-123-025-004

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

と書いてありました。僕は先入観マシマシで公式見ても、は?何言っとるだ?ってなったんですけど清らかな心でちゃんと読めばそのまんまでした。猛省。

Caret Rangesについて

caret rangeは以下のようになっています。

In other words, this allows patch and minor updates for versions 1.0.0 and above, patch updates for versions 0.X >=0.1.0, and no updates for versions 0.0.X.

例を見るとわかりやすいです。

^1.2.3 := >=1.2.3 <2.0.0
^0.2.3 := >=0.2.3 <0.3.0
^0.0.3 := >=0.0.3 <0.0.4

上記の例からもうわかると思いますが、caretは0以外の左端の数字を変更しないアップデートを認める ということです。

勘違いしていた例をもう一度見てみましょう。

"eslint-plugin-prettier": "^3.1.3",

上記の例の場合で0じゃない一番左端の数字ってどれでしょう?

左端の3 ですよね。つまり、^3.1.3 では3 を変更しない箇所までのバージョンをあげるという意味になります。

なので、

^3.1.3 := >=3.1.3 <4.0.0

ということになります。

感想

ブレイクな変更の可能性があるから、それを回避したいためにキャレットつける。ということに囚われていて勘違いをしていました。愚か過ぎました。ちゃんと今回理解できてよかったなって話でした。おわり。

Discussion