私は、最新の安定にアップグレードした後node
とnpm
、私が試してみましたnpm install moment --save
。エントリをpackage.json
キャレット^
プレフィックス付きで保存します。以前は、チルダ~
プレフィックスでした。
- なぜこれらの変更は行われるの
npm
ですか? - チルダ
~
とキャレットの違いは何^
ですか? - 他より優れている点は何ですか?
私は、最新の安定にアップグレードした後node
とnpm
、私が試してみましたnpm install moment --save
。エントリをpackage.json
キャレット^
プレフィックス付きで保存します。以前は、チルダ~
プレフィックスでした。
npm
ですか?~
とキャレットの違いは何^
ですか?回答:
NPMのドキュメントとsemverのドキュメントをご覧ください。
〜version「バージョンとほぼ同等」は、マイナーバージョンを増分せずに、将来のすべてのパッチバージョンに更新します。~1.2.3
1.2.3から<1.3.0までのリリースを使用します。
^ version「バージョンと互換性がある」は、メジャーバージョンを増分せずに、将来のすべてのマイナー/パッチバージョンに更新します。^2.3.4
2.3.4から<3.0.0までのリリースを使用します。
以下のコメントを参照してください。
^
またはa を付加するnpmのナンセンスをすべて取り除くこともできます~
。:あなたがあなたのバージョンより厳密な制御を持っているしたい場合は、これを設定する npm config set save-prefix=''
0.2.x
、2
はになりますmajor version
。これが、docs.npmjs.comが特定の単語を使用した理由ですthe left-most non-zero digit
。また、この場合について:^ 0.0.4は0.0.4を意味します
A
3つのバージョンのパッケージがあるとします:0.0.1
、0.0.2
および0.0.3
。にはバグがある0.0.1
ので、少なくとも0.0.2
パッケージに入れておきますB
。あなたが書け0.0.x
ばあなたは得るでしょう0.0.3
、それは大丈夫です。しかし、他のいくつかのパッケージC
が両方B
を必要としA
、さらに制約がある"A": "<0.0.2"
場合は0.0.1
、競合の問題を示すことなく取得できますが、これは望ましいことではありません。チルダ~0.0.2
を使用すると、この問題を回避できます。
質問で言及されているものを含む、バージョンの特定のためのすべての方法を説明する公式のnpmjsドキュメントも追加したいと思います-
https://docs.npmjs.com/files/package.json
https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-
~version
「バージョンとほぼ同等」npm semver- Tilde Ranges&semver(7)を参照^version
「バージョンとの互換性」npm semver- Caret Ranges&semver(7)を参照version
バージョンと正確に一致する必要があります>version
バージョンより大きい必要があります>=version
等<version
<=version
1.2.x
1.2.0、1.2.1など。ただし1.3.0は不可http://sometarballurl
(これはローカルにダウンロードおよびインストールされるtarballのURLである可能性があります*
すべてのバージョンに一致latest
最新のリリースを取得上記のリストは完全なものではありません。その他のバージョン指定子には、GitHubのURLとGitHubのユーザーリポジトリ、ローカルパス、特定のnpmタグ付きのパッケージなどがあります。
1.2.0 || >=1.2.2 <1.3.0
1.2.0、または1.2.2から1.3.0までのすべて(包括的)。ただし、1.2.1または1.3.1以上ではなく、1.1でもない.x以下。
"Approximately equivalent to version"
そして"Compatible with version"
〜と^の振る舞いを説明するのにイライラするほど非特定的な方法です。実際の回答を提供してくれて、@ jgillichに感謝します。
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
メジャーレベルのパッケージをインストールすると、更新プログラムは新しいベータ/ prレベルのバージョンのみをインストールします!これnpm
は^
、がデフォルトとして設定されpackage.json
、インストールされたバージョンがのよう0.1.3
になっている場合、すべてのメジャー/マイナー/パッチレベルがフリーズするためです。
~
メジャー番号とマイナー番号を修正しました。依存関係のバグ修正を受け入れる準備ができているが、互換性のない可能性のある変更を望まない場合に使用されます。
^
メジャー番号のみを修正します。依存関係を注意深く監視していて、マイナーリリースに互換性がない場合にコードをすばやく変更する準備ができている場合に使用されます。
それに加えて、^
されたサポートされていません古いNPMのバージョンによって、注意して使用する必要があります。
したがって、これ^
は適切なデフォルトですが、完全ではありません。あなたにとって最も役立つsemverオペレーターを注意深く選択して構成することをお勧めします。
~
:合理的に近いと
~1.1.5: 1.1.0 <= accepted < 1.2.0
^
:互換性を持ちます
^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
^0.1.3
バージョンのみを0.1.x
受け入れ0.2.0
、は受け入れません。この動作はと同等~0.1.3
です。この動作の背後にある理由は、ゼロ番目のリリースのパッケージがまだ不安定であると見なされているという事実によるものです。semver.org、#4 の言葉では、「いつでも何でも変更される可能性があります」(下位互換性のない変更を含む)。
^
is 1. [any]。[any](最新のマイナーバージョン)
~
は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.
〜チルダ:
~
メジャー番号とマイナー番号をフリーズします。^キャレット:
^
メジャー番号のみをフリーズします。Tilde〜はマイナーバージョンと一致します。1.4.2が含まれるパッケージをインストールしていて、インストール後、package.jsonで〜1.4.2として使用し、npm installを実行すると、バージョン1.4.3および1.4.4も使用できますアップグレード後のプロジェクトでは、プロジェクトに1.4.4がインストールされます。しかし、そのパッケージで利用可能な1.5.0がある場合、それは〜によってインストールされません。マイナーバージョンと呼ばれます。
キャレット^はメジャーバージョンに一致します。プロジェクトに1.4.2パッケージがインストールされていて、インストール1.5.0がリリースされた後、^はメジャーバージョンをインストールします。^ 1.4.2がある場合、2.1.0をインストールできません。
固定バージョン特殊文字アウトと各インストール上のパッケージの変更バージョンにしたくない場合は、次に使用される固定バージョン例えば「1.4.2」
最新バージョン*最新バージョンをインストールする場合は、パッケージ名の前に*のみを使用してください。
ワンライナー解説
標準のバージョン管理システムは、major.minor.buildです(例2.4.1)。
npmは、これらの文字に基づいて特定のパッケージのバージョンをチェックして修正します
〜:メジャーバージョンが修正され、マイナーバージョンが修正され、任意のビルド番号に一致します
例:〜2.4.1は、2.4.xをチェックすることを意味します。
^:メジャーバージョンは修正され、任意のマイナーバージョンに一致し、任意のビルド番号に一致します
例:^ 2.4.1は、2.xxをチェックすることを意味します。
おそらく、package.jsonのチルダ(〜)とキャレット(^)を見たことがあるでしょう。それらの違いは何ですか?
npm install moment --saveを実行すると、エントリがpackage.jsonにキャレット(^)プレフィックス付きで保存されます。
簡単に言うと、ティルダ(〜)は最新のマイナーバージョン(中央の数字)と一致します。〜1.2.3はすべての1.2.xバージョンに一致しますが、1.3.0には対応しません。
一方、キャレット(^)はよりリラックスしています。最新のメジャーバージョン(最初の番号)に更新されます。^ 1.2.3は、1.3.0を含むすべての1.xxリリースと一致しますが、2.0.0には対応しません。
リファレンス:https : //medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b
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
チルダ(〜)
メジャーバージョンは修正済み、マイナーバージョンは修正済み、任意のビルド番号に一致
"express": "~4.13.3"
~4.13.3
4.13.xをチェックすることを意味します。ここで、xは何でもあり、4.14.0です。
キャレット(^)
メジャーバージョンは修正され、マイナーバージョンと一致し、ビルド番号と一致します
"supertest": "^3.0.0"
^3.0.0
3.xxをチェックすることを意味します。
バージョン番号は、各セクションを異なる意味で指定する構文になっています。構文は、ドットで区切られた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などのパッチバージョンをインストールすることを意味します。
カラットに ^
は、同じメジャー範囲の特定のバージョンよりも大きいすべてが含まれます。
チルダに ~
は、同じマイナー範囲内の特定のバージョンよりも大きいすべてが含まれます。
たとえば、1.0.4までの許容可能なバージョン範囲を指定するには、次の構文を使用します。
セマンティックバージョニング構文の詳細については、npm semver計算機を参照してください。
npmドキュメントの詳細セマンティックバージョニングについて
それ自体は答えではなく、見落とされているように見える所見です。
カラット範囲の説明:
参照してください:https : //github.com/npm/node-semver#caret-ranges-123-025-004
[major、minor、patch]タプルの左端のゼロ以外の数字を変更しない変更を許可します。
^10.2.3
一致する手段10.2.3 <= v < 20.0.0
それが彼らの意味だとは思わない。バージョン11.xxから19.xxを取り込むと、コードが破損します。
彼らが意味したと思うleft most non-zero number field
。SemVerには、数値フィールドを1桁にする必要があるものはありません。
〜マイナーバージョンリリースの仕様^メジャーバージョンリリースを指定
たとえば、パッケージのバージョンが4.5.2の場合、アップデート時に〜4.5.2は最新の4.5.xバージョン(マイナーバージョン)をインストールします^ 4.5.2は最新の4.xxバージョン(メジャーバージョン)をインストールします
この質問に関連して、バージョンに関するComposerのドキュメントを確認できますが、ここでは簡単に説明します。
したがって、Tildeを使用すると、パッチの自動更新が行われますが、マイナーバージョンとメジャーバージョンは更新されません。ただし、Caretを使用する場合は、パッチとマイナーバージョンを取得しますが、メジャー(重大な変更)バージョンは取得しません。
ティルデバージョンは「安全な」アプローチと見なされますが、信頼性の高い依存関係(よく管理されたライブラリ)を使用している場合は、キャレットバージョンに問題はありません(マイナーな変更によって変更が破壊されることはないためです)。
composer installとcomposer updateの違いについては、おそらくこのStackoverflowの投稿を確認する必要があります。
npm config set save-prefix=''
。(~
それがあなたの好みの場合は、引用符で囲んでください。)私は個人的にこれを行い、製造中のものをシュリンクラップします。