最新の安定版node
とにアップグレードした後npm
、 を試しnpm install moment --save
ました。エントリをpackage.json
キャレット^
接頭辞付きで保存します。以前は、チルダの~
プレフィックスでした。
- でこれらの変更が行われたのはなぜ
npm
ですか? ~
チルダと キャレットはどう違います^
か?- 他社より優れている点は?
最新の安定版node
とにアップグレードした後npm
、 を試しnpm install moment --save
ました。エントリをpackage.json
キャレット^
接頭辞付きで保存します。以前は、チルダの~
プレフィックスでした。
npm
ですか?~
チルダと キャレットはどう違います^
か?質問で言及されているものを含む、バージョン固有のすべての方法を説明する公式の npmjs ドキュメントも追加したいと思います
価値 | 説明 |
---|---|
~version |
「バージョンとほぼ同等」npm semver - チルダ範囲 を参照 |
^version |
「バージョンと互換性があります」npm semver - キャレット範囲 を参照してください |
version |
バージョンと正確に一致する必要があります |
>version |
バージョンより大きい必要があります |
>=version |
等 |
<version |
|
<=version |
|
1.2.x |
1.2.0、1.2.1 など、ただし 1.3.0 は除く |
* |
どのバージョンにもマッチ |
latest |
最新リリースを入手 |
上記のリストは網羅的なものではありません。その他のバージョン指定子には、GitHub URL と GitHub ユーザー リポジトリ、ローカル パス、および特定の npm タグを含むパッケージが含まれます。
npm では、指定されたものよりも新しいバージョンのパッケージをインストールできます。チルダ ( ~
) を使用すると、バグ修正リリースが提供され、キャレット ( ^
) を使用すると、下位互換性のある新しい機能も提供されます。
問題は、通常、古いバージョンではバグ修正があまり受けられないため、npm は^
のデフォルトとしてキャレット () を使用することです--save
。
によると、「Semver の説明 - package.json にキャレット (^) があるのはなぜですか?」.
ルールは 1.0.0 より上のバージョンに適用され、すべてのプロジェクトがセマンティック バージョニングに従うわけではないことに注意してください。バージョン 0.xx では、キャレットはパッチの更新のみを許可します。つまり、チルダと同じように動作します。「キャレット範囲」を参照してください
概念の視覚的な説明は次のとおりです。
出典: 「セマンティック バージョニング チートシート」 .
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
1.2.3
.^
ます。左から 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
注意: メジャー、マイナー、パッチの欠落または番号なしの指定は、欠落レベルbeta
と同じです。any
注意: メジャー レベルのパッケージをインストールする0
と、アップデートは新しい beta/pr レベル バージョンのみをインストールします。これは、 がデフォルトとして設定されてnpm
おり、インストールされているバージョンが のような場合、すべてのメジャー/マイナー/パッチ レベルがフリーズするためです。^
package.json
0.1.3
最初の数字 (「メジャー」) が少なくとも 1 である限り:
~
メジャー番号とマイナー番号をロックします。これは、バグ修正 (3 番目の数字の増分) のみを受け入れる準備ができているが、機能を追加するマイナーなアップグレードでさえも、他の変更は望まない場合に使用されます。
^
メジャー番号のみをロックします。これは、バグ修正 (3 番目の番号の増分) と、機能を追加するが既存のコードを壊してはならないマイナー アップグレード (2 番目の番号の増分) を喜んで受け取る場合に使用されます。ただし、既存のコードを壊すような変更 (最初の数字の増加) は望ましくありません。
それに加えて、古い npm バージョンで^
はサポートされていないため、注意して使用する必要があります。
したがって、^
デフォルトは適切ですが、完全ではありません。最も便利な semver オペレーターを慎重に選択して構成することをお勧めします。
(「修正」と「バグ修正」を「修正」の矛盾する使用法で言うのを避けるために改訂されました。これは混乱を招きます)
^
1.[any].[any] (最新のマイナー バージョン)
~
is 1.2.[any] (最新のパッチ)
semver が npm にどのように適用されるか、およびsemver 標準
に一致させるために何を行っているかについては、このブログ記事をよく読んでください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
ます。これは、「このリリースは長期的なサービス リリースです。続行して、このバージョンのライブラリを本番環境で使用できます。コード、そして作者は明日、または来月すべてを変更することはなく、パッケージを放棄することもありません.
ルールは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.
semver は、ドットで区切られた 3 つの主要なセクションに分かれています。
major.minor.patch
1.0.0
これらの異なるメジャー、マイナー、およびパッチは、異なるリリースを識別するために使用されます。タイド (~) とキャレット (^) は、パッケージのバージョン管理で使用するマイナー バージョンとパッチ バージョンを識別するために使用されます。
~1.0.1
Install 1.0.1 or **latest patch versions** such as 1.0.2 ,1.0.5
^1.0.1
Install 1.0.1 or **latest patch and minor versions** such as 1.0.2 ,1.1.0 ,1.1.1
バージョン番号は、各セクションを異なる意味で指定する構文にあります。構文は、ドットで区切られた 3 つのセクションに分かれています。
メジャー.マイナー.パッチ 1.0.2
メジャー、マイナー、およびパッチは、パッケージのさまざまなリリースを表します。
npm はチルダ (~) とキャレット (^) を使用して、それぞれ使用するパッチとマイナー バージョンを指定します。
したがって、~1.0.2 と表示されている場合は、バージョン 1.0.2 または 1.0.4 などの最新のパッチ バージョンをインストールすることを意味します。^1.0.2 が表示された場合は、バージョン 1.0.2、または 1.1.0 などの最新のマイナーまたはパッチ バージョンをインストールすることを意味します。
それ自体は答えではありませんが、見落とされているように見える観察です。
キャレット範囲の説明:
参照: https://github.com/npm/node-semver#caret-ranges-123-025-004
[メジャー、マイナー、パッチ] タプルの左端のゼロ以外の数字を変更しない変更を許可します。
^10.2.3
一致することを意味します10.2.3 <= v < 20.0.0
私はそれが彼らの意図したものではないと思います。バージョン 11.xx から 19.xx を取り込むと、コードが壊れます。
私は彼らが意味したと思いますleft most non-zero number field
。SemVer には、数値フィールドが 1 桁であることを要求するものは何もありません。