web-dev-qa-db-ja.com

Package.jsonのチルダ(〜)とキャレット(^)の違いは何ですか?

最新の安定版nodenpmにアップグレードした後、npm install moment --saveを試しました。キャレットのpackage.jsonプレフィックスを付けて、エントリを^に保存します。以前は、チルダの~プレフィックスでした。

  1. なぜこれらの変更はnpmで行われるのですか?
  2. チルダ~とキャレット^の違いは何ですか?
  3. 他の人に勝る利点は何ですか?
2806
Fizer Khan

チルダ~は、指定されたマイナーバージョン(2番目の番号)の最新のパッチバージョン(3番目の番号)と一致します。
〜1.2.3はすべての1.2.xバージョンと一致しますが、1.3.0では延期されます。

キャレット^はもっとリラックスしています。指定したメジャーバージョン(最初の番号)の最新のマイナーバージョン(2番目の番号)と一致します。
^ 1.2.3は1.3.0を含むどの1.x.xリリースとも一致しますが、2.0.0では延期されます。

(これは http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/ の修正版および修正版です)

3239
jgillich

私は公式のnpmjsドキュメンテーションも追加したいと思います。それは質問で言及されたものを含むバージョン特有性のためのすべての方法を説明します -

https://docs.npmjs.com/files/package.json

https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-

  • ~version "バージョンとほぼ同じ"を参照してください。 npm semver - ティルド範囲 && semver(7)
  • ^version "バージョンとの互換性" npm semver - キャレット範囲semver(7) を参照
  • versionバージョンと完全に一致する必要があります
  • >versionバージョンより大きくなければなりません
  • >=version etc
  • <version
  • <=version
  • 1.2.x 1.2.0、1.2.1など。ただし、1.3.0ではない
  • http://sometarballurl(これはローカルにダウンロードされインストールされるtarballのURLかもしれません
  • *任意のバージョンに一致
  • latest最新リリースを入手

上記のリストは網羅的なものではありません。他のバージョン指定子には、GitHub URLとGitHubユーザーレポジトリ、特定のnpmタグ付きのローカルパスとパッケージが含まれます。

730
Ahmad

Npmは指定されたものより新しいバージョンのパッケージをインストールすることを可能にします。チルダ(~)を使用するとバグ修正リリースが得られ、キャレット(^)を使用すると後方互換性のある新しい機能も得られます。

問題は古いバージョンでは通常それほどバグ修正が行われていないため、npmは^のデフォルトとしてキャレット(--save)を使用します。

semver table

によると、 "Semverは説明しました - なぜ私のpackage.jsonにキャレット(^)があるのですか?"

この規則は1.0.0より上のバージョンに適用され、すべてのプロジェクトがセマンティックバージョン管理に従うわけではないことに注意してください。バージョン0.x.xの場合、キャレットはpatchの更新のみを許可します。つまり、チルダと同じように動作します。 "キャレット範囲" を参照してください。

これが概念の視覚的説明です。

semver diagram

出典: "セマンティックバージョニングのチートシート"

464
pspi

~はメジャー番号とマイナー番号を修正します。依存関係のバグ修正を受け入れる準備ができていても、互換性のない可能性のある変更を望まない場合に使用します。

^はメジャー番号だけを修正します。あなたが依存関係を注意深く見ていて、マイナーリリースに互換性がない場合にコードを素早く変更する準備ができているときに使用されます。

それに加えて、^は古いnpmバージョンでは サポートされていません であり、注意して使うべきです。

そのため、^がデフォルトですが、完璧というわけではありません。私はあなたにとって最も有用なsemverオペレータを慎重に選んで設定することを勧めます。

81
alex

センバー

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • テストには npm semver calculator を使用してください。 (^(同じメジャー範囲内の特定のバージョンより大きいものすべてを含む)および〜(同じマイナー範囲の特定のバージョンより大きいものすべてを含む)の説明は100%正しいわけではありませんが、電卓は問題なく動作します)
  • あるいは、代わりに SemVer Check を使用してください。パッケージを選択する必要はなく、説明も表示されます。

変更を許可または禁止する

  • ピンバージョン:1.2.3
  • ^を使います(headのように)。左から2番目のゼロ以外のレベルでの更新を許可します。^0.2.30.2.3 <= v < 0.3を意味します。
  • (tailのように)~を使用してください。一般的に一番右のレベルをフリーズするか、省略した場合はゼロを設定します。
    • ~11.0.0 <= v < 2.0.0を意味します
    • ~1.21.2.0 <= v < 1.3.0を意味します。
    • ~1.2.41.2.4 <= v < 1.3.0を意味します。
  • 最も右のレベルを省略します。0.20.2 <= v < 1を意味します。 ~とは異なります。
    • 省略レベルのバージョンの開始は常に0です
    • サブレベルを指定せずにメジャーバージョンの開始を設定できます。

すべての(うまくいけば)可能性

開始メジャーレベルを設定し、上方への更新を許可する

*  or "(empty string)   any version
1                         v >= 1

メジャーレベルの凍結

~0 (0)            0.0 <= v < 1
0.2               0.2 <= v < 1          // Can't do that with ^ or ~ 
~1 (1, ^1)        1 <= v < 2
^1.2              1.2 <= v < 2
^1.2.3            1.2.3 <= v < 2
^1.2.3-beta.4     1.2.3-beta.4 <= v < 2

マイナーレベルのフリーズ

^0.0 (0.0)        0 <= v < 0.1
~0.2              0.2 <= v < 0.3
~1.2              1.2 <= v < 1.3
~0.2.3 (^0.2.3)   0.2.3 <= v < 0.3
~1.2.3            1.2.3 <= v < 1.3

フリーズパッチレベル

~1.2.3-beta.4     1.2.3-beta.4 <= v < 1.2.4 (only beta or pr allowed)
^0.0.3-beta       0.0.3-beta.0 <= v < 0.0.4 or 0.0.3-pr.0 <= v < 0.0.4 (only beta or pr allowed)
^0.0.3-beta.4     0.0.3-beta.4 <= v < 0.0.4 or 0.0.3-pr.4 <= v < 0.0.4 (only beta or pr allowed)

更新を許可しない

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Notice:メジャー、マイナー、パッチが欠けている、または番号なしでbetaを指定することは、欠けているレベルのanyと同じです。

Notice:メジャーレベルが0のパッケージをインストールすると、アップデートは新しいbeta/prレベルのバージョンのみをインストールします。これは、npm^のデフォルトとしてpackage.jsonを設定し、インストールされているバージョンが0.1.3のような場合、すべてのメジャー/マイナー/パッチレベルを凍結するためです。

79
rofrol

~:合理的に 閉じる

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^ 互換性のある with

   ^1.1.5: 1.1.5 <= accepted < 2.0.0

   ^0.1.3: 0.1.3 <= accepted < 0.2.0

   ^0.0.4: 0.0.4 <= accepted < 0.1.0
50
haotang

^は1です。[any]。[any](最新のマイナーバージョン)
~は1.2です。[any](最新のパッチ)

このブログ記事 にsemverがnpmにどのように適用されるかについてのすばらしい記事があります。
そしてそれを一致させるために彼らがしていることは 標準的な標準に一致します
http://blog.npmjs.org/post/98131109725/npm-2-0-0

28
Will Stern

ハットマッチングは^0.1.20.2.0に更新しないので「壊れている」と考えられます。ソフトウェアが登場したときには0.x.yバージョンを使用し、ハットマッチングは最後に変化する数字(y)にのみマッチします。これは意図的に行われています。その理由は、ソフトウェアが進化している間にAPIが急速に変化するからです。ある日あなたはこれらのメソッドを持ち、他の日はあなたはそれらのメソッドを持ち、古いものはなくなりました。ライブラリをすでに使っている人のためにコードを壊したくない場合は、メジャーバージョンを増やしてください。 1.0.0 - > 2.0.0 - > 3.0.0。ですから、あなたのソフトウェアがついに100%完成しフル機能になるまでには、それはバージョン11.0.0のようになるでしょう、そしてそれはあまり意味がないように見え、そして実際に混乱します。一方、0.1.x - > 0.2.x - > 0.3.xのバージョンを使用していた場合、ソフトウェアはついに100%完成してフル機能を備え、それはバージョン1.0.0としてリリースされ、「このリリースは長期版です」と意味します。サービス1では、このバージョンのライブラリを先に進めて本番コードで使用することができます。また、作成者は明日や来月にすべてを変更することはありません。

ソフトウェアがまだ成熟していない場合は0.x.yバージョン管理を使用し、パブリックAPIが変更された場合は中央の数字を増やしてリリースする(したがって、^0.1.0を持っている人は0.2.0を更新せず、コードが破損しません)。その後、ソフトウェアが成熟したら、1.0.0の下でそれを解放し、あなたの公開APIが変更されるたびに左端の数字をインクリメントしてください(したがって^1.0.0を持っている人は2.0.0更新を得ず、コードを壊しません)。

Given a version number MAJOR.MINOR.PATCH, increment the:

MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards-compatible manner, and
PATCH version when you make backwards-compatible bug fixes.
26
asdfasdfads

ワンライナー説明

標準のバージョン管理システムは、major.minor.buildです(例2.4.1)。

npmはこれらの文字に基づいて特定のパッケージのバージョンをチェックして修正します。

:メジャーバージョンは固定、マイナーバージョンは固定、任意のビルド番号に一致

例:〜2.4.1は2.4.xをチェックします - ここでxは何でも

^ :メジャーバージョンは固定されており、マイナーバージョンと一致し、ビルド番号と一致します

例:^ 2.4.1は2.x.xをチェックすることを意味します。ここでxは何でも

14
Avinash

あなたはおそらくpackage.jsonでチルダ(〜)とキャレット(^)を見たことがあるでしょう。それらの違いは何ですか?

Npm install moment --saveを実行すると、エントリは、キャレット(^)プレフィックスを付けてpackage.jsonに保存されます。

チルダ(〜)

簡単に言うと、チルダ(〜)は最新のマイナーバージョン(真ん中の数字)に一致します。 〜1.2.3はすべての1.2.xバージョンと一致しますが、1.3.0は欠落します。

キャレット(^)

一方、キャレット(^)はもっとリラックスしています。それはあなたを最新のメジャーバージョン(最初の番号)に更新します。 ^ 1.2.3は1.3.0を含むすべての1.x.xリリースと一致しますが、2.0.0では延期されます。

参照: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b

12
Abdou Sameh

Tilde〜 はマイナーバージョンと一致します。もしあなたが1.4.2を持っているパッケージをインストールしていて、あなたのpackage.jsonで〜1.4として使われていればバージョン1.4.3と1.4.4も利用できます。 2アップグレード後にnpmをプロジェクトにインストールすると、プロジェクトに1.4.4がインストールされます。しかし、そのパッケージには1.5.0があり、それによって〜によってインストールされることはありません。それはマイナーバージョンと呼ばれています。

キャレット^ がメジャーバージョンと一致します。1.4.2パッケージがプロジェクトにインストールされていて1.5.0も利用可能な場合は、メジャーバージョンがインストールされます。 ^ 1.4.2 がある場合、2.1.0のインストールは許可されません。

固定バージョン 各インストールでパッケージのバージョンを変更したくない場合は、特別な文字を付けずに固定バージョンを使用してください。例: "1.4.2"

最新バージョン* 最新バージョンをインストールする場合は、パッケージ名の前に*を使用してください。

10
Mudassir

〜ティルド:

  • ~ fix メジャー番号とマイナー番号。
  • 依存関係のバグ修正を受け入れる準備ができていても、互換性のない可能性のある変更を望まない場合に使用します。
  • チルダは 最新のマイナーバージョン (ミドルナンバー)と一致します。
  • 1.2.3はすべての1.2.xバージョンと一致しますが、1.3.0は欠落します。
  • チルダ(〜)はバグ修正リリースを提供します

^キャレット:

  • ^はメジャー番号だけを修正します。
  • あなたが依存関係を注意深く見ていて、マイナーリリースに互換性がない場合にコードを素早く変更する準備ができているときに使用されます。
  • 最新のメジャーバージョン (最初の番号)に更新されます。
  • ^ 1.2.3は1.3.0を含むすべての1.x.xリリースと一致しますが、2.0.0では延期されます。
  • キャレット(^)を使用すると、下位互換性のある新機能も使用できます。
7
Laxmi

チルド(〜)

メジャーバージョンは固定、マイナーバージョンは固定、任意のビルド番号に一致

"express": "~4.13.3" 

~4.13.3は、xがanyで4.14.0である4.13.xをチェックすることを意味します。

キャレット(^)

メジャーバージョンは固定されており、マイナーバージョンと一致し、ビルド番号と一致します

"supertest": "^3.0.0"

^3.0.0は、3.x.xをチェックすることを意味します。ここで、xは何でも

5
Farhan Yaseen

バージョン番号は、各セクションを異なる意味で指定する構文です。構文は、ドットで区切られた3つのセクションに分かれています。

major.minor.patch 1.0.2

メジャー、マイナー、およびパッチは、パッケージの異なるリリースを表します。

npmはチルダ(〜)とキャレット(^)を使用して、それぞれ使用するパッチとマイナーバージョンを指定します。

そのため、〜1.0.2と表示されている場合は、バージョン1.0.2または1.0.4などの最新のパッチバージョンをインストールすることを意味します。 ^ 1.0.2と表示された場合は、バージョン1.0.2、または1.1.0などの最新のマイナーバージョンまたはパッチバージョンをインストールすることを意味します。

3

carat^は、同じメジャー範囲の特定のバージョンよりも大きいすべてのものを含みます。

tilde~は、同じマイナー範囲内の特定のバージョンよりも大きいすべてのものを含めます。

たとえば、許容されるバージョン範囲を最大1.0.4に指定するには、次の構文を使用します。

  • パッチリリース:1.0または1.0.xまたは〜1.0.4
  • マイナーリリース:1または1.xまたは^ 1.0.4
  • メジャーリリース:*またはx

セマンティックバージョニングの構文の詳細については、 npm semver calculator を参照してください。

npm semantic versions in published packages§

Npmドキュメントの詳細 セマンティックバージョニングについて

2
ElasticCode

〜マイナーバージョンリリースへの仕様^メジャーバージョンリリースへの指定

例えば、パッケージのバージョンが4.5.2の場合、アップデート時に4.5.2は最新の4.5.xバージョン(マイナーバージョン)をインストールします^ 4.5.2は最新の4.x.xバージョン(メインバージョン)をインストールします

2
user2849063

それ自体は答えではありませんが、見落とされてきたように見える観測です。

カラットの説明は次のとおりです。

参照してください: https://github.com/npm/node-semver#caret-ranges-123-025-004

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

^10.2.310.2.3 <= v < 20.0.0と一致することを意味します

それが彼らが意味していたことではないと思います。バージョン11.x.xから19.x.xまでを引っ張ると、コードが壊れます。

私は彼らがleft most non-zero number fieldを意味したと思います。 SemVerには、数値フィールドを1桁にする必要があるものは何もありません。

1
Jesse Chisholm