最新の安定版node
とnpm
にアップグレードした後、npm install moment --save
を試しました。キャレットのpackage.json
プレフィックスを付けて、エントリを^
に保存します。以前は、チルダの~
プレフィックスでした。
npm
で行われるのですか?~
とキャレット^
の違いは何ですか?チルダ
~
は、指定されたマイナーバージョン(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/ の修正版および修正版です)
私は公式の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タグ付きのローカルパスとパッケージが含まれます。
Npmは指定されたものより新しいバージョンのパッケージをインストールすることを可能にします。チルダ(~
)を使用するとバグ修正リリースが得られ、キャレット(^
)を使用すると後方互換性のある新しい機能も得られます。
問題は古いバージョンでは通常それほどバグ修正が行われていないため、npmは^
のデフォルトとしてキャレット(--save
)を使用します。
によると、 "Semverは説明しました - なぜ私のpackage.jsonにキャレット(^)があるのですか?" 。
注 この規則は1.0.0より上のバージョンに適用され、すべてのプロジェクトがセマンティックバージョン管理に従うわけではないことに注意してください。バージョン0.x.xの場合、キャレットはpatchの更新のみを許可します。つまり、チルダと同じように動作します。 "キャレット範囲" を参照してください。
これが概念の視覚的説明です。
出典: "セマンティックバージョニングのチートシート" 。
~
はメジャー番号とマイナー番号を修正します。依存関係のバグ修正を受け入れる準備ができていても、互換性のない可能性のある変更を望まない場合に使用します。
^
はメジャー番号だけを修正します。あなたが依存関係を注意深く見ていて、マイナーリリースに互換性がない場合にコードを素早く変更する準備ができているときに使用されます。
それに加えて、^
は古いnpmバージョンでは サポートされていません であり、注意して使うべきです。
そのため、^
がデフォルトですが、完璧というわけではありません。私はあなたにとって最も有用なsemverオペレータを慎重に選んで設定することを勧めます。
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
1.2.3
。^
を使います(headのように)。左から2番目のゼロ以外のレベルでの更新を許可します。^0.2.3
は0.2.3 <= v < 0.3
を意味します。~
を使用してください。一般的に一番右のレベルをフリーズするか、省略した場合はゼロを設定します。~1
は1.0.0 <= v < 2.0.0
を意味します~1.2
は1.2.0 <= v < 1.3.0
を意味します。~1.2.4
は1.2.4 <= v < 1.3.0
を意味します。0.2
は0.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
のような場合、すべてのメジャー/マイナー/パッチレベルを凍結するためです。
~
:合理的に 閉じる に
~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
^
は1です。[any]。[any](最新のマイナーバージョン)~
は1.2です。[any](最新のパッチ)
このブログ記事 にsemverがnpmにどのように適用されるかについてのすばらしい記事があります。
そしてそれを一致させるために彼らがしていることは 標準的な標準に一致します
http://blog.npmjs.org/post/98131109725/npm-2-0-0
ハットマッチングは^0.1.2
を0.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.
ワンライナー説明
標準のバージョン管理システムは、major.minor.buildです(例2.4.1)。
npmはこれらの文字に基づいて特定のパッケージのバージョンをチェックして修正します。
〜 :メジャーバージョンは固定、マイナーバージョンは固定、任意のビルド番号に一致
例:〜2.4.1は2.4.xをチェックします - ここでxは何でも
^ :メジャーバージョンは固定されており、マイナーバージョンと一致し、ビルド番号と一致します
例:^ 2.4.1は2.x.xをチェックすることを意味します。ここでxは何でも
あなたはおそらく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
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"
最新バージョン* 最新バージョンをインストールする場合は、パッケージ名の前に*を使用してください。
〜ティルド:
~
fix メジャー番号とマイナー番号。 ^キャレット:
^
はメジャー番号だけを修正します。チルド(〜)
メジャーバージョンは固定、マイナーバージョンは固定、任意のビルド番号に一致
"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は何でも
バージョン番号は、各セクションを異なる意味で指定する構文です。構文は、ドットで区切られた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などの最新のマイナーバージョンまたはパッチバージョンをインストールすることを意味します。
carat^
は、同じメジャー範囲の特定のバージョンよりも大きいすべてのものを含みます。
tilde~
は、同じマイナー範囲内の特定のバージョンよりも大きいすべてのものを含めます。
たとえば、許容されるバージョン範囲を最大1.0.4に指定するには、次の構文を使用します。
セマンティックバージョニングの構文の詳細については、 npm semver calculator を参照してください。
Npmドキュメントの詳細 セマンティックバージョニングについて
〜マイナーバージョンリリースへの仕様^メジャーバージョンリリースへの指定
例えば、パッケージのバージョンが4.5.2の場合、アップデート時に4.5.2は最新の4.5.xバージョン(マイナーバージョン)をインストールします^ 4.5.2は最新の4.x.xバージョン(メインバージョン)をインストールします
それ自体は答えではありませんが、見落とされてきたように見える観測です。
カラットの説明は次のとおりです。
参照してください: 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.3
が10.2.3 <= v < 20.0.0
と一致することを意味します
それが彼らが意味していたことではないと思います。バージョン11.x.xから19.x.xまでを引っ張ると、コードが壊れます。
私は彼らがleft most non-zero number field
を意味したと思います。 SemVerには、数値フィールドを1桁にする必要があるものは何もありません。