1. ホーム
  2. node.js

[解決済み】bower(とnpm)バージョンの構文は何ですか?

2022-03-31 21:49:11

質問

Bowerでは、以下のような構文でパッケージのバージョン要件を指定することができます。

"dependencies": {
  "<name>": "<version>",
},

しかし、この構文がどのようなものなのかがわかりません。 <version> . バージョンを指定できることは知っています。

  • であるバージョンより大きい ">1.0.0"
  • バージョンより大きいか等しい ">=1.0.0"
  • またはある範囲にある。 "1.0.0 - 2.0.0" .

また、チルダを含む一般的なバージョン構文があることも知っています。 "~1.0.0" . しかし、それが何を意味するのか、また、それが "=1.0.0" .

また、連続しない複数のバージョンを指定することができるのかどうか、例えば、正確に 1.0.3 よりも大きいバージョンと 1.5.0 などなど...

解決方法は?

簡単に言うと、Bowerのバージョン番号(とNPMの)のための構文はSemVerと呼ばれ、「Semantic Versioning」の略です。BowerとNPMで使用されているSemVerの詳細な構文については、以下のAPIでドキュメントを見つけることができます。 Node/npmのsemverパーサーは . 基本的な仕様については、こちらで詳しく説明されています。 ではなく について言及します。 ~ またはその他の構文の詳細)を semver.org .

がありますね。 超便利なビジュアルセンバー計算機 で遊べるので、理解やテストがより簡単になります。

SemVerは単なる構文ではありません。APIを公開する正しい方法について、非常に興味深いことが書かれており、この構文の意味を理解するのに役立ちます。重要なことです。

<ブロッククオート

公開APIを特定したら、その変更をバージョン番号の具体的な増分で伝える。 X.Y.Z(メジャー.マイナー.パッチ)のバージョン形式を考える . APIに影響を与えないバグフィックスはパッチバージョン、後方互換性のあるAPIの追加・変更はマイナーバージョン、後方互換性のないAPIの変更はメジャーバージョンをインクリメントしています。

では、具体的な質問である ~ は、このMajor.Minor.Patchスキーマに関連するものです。(関連するキャレット演算子 ^ .) を使用することができます。 ~ というように、受け入れるバージョンの範囲をどちらかに絞ることができます。

  • 後続 パッチレベル は、同じマイナーバージョンへの変更 ( APIに影響を与えないバグフィックスです。 )、または
  • 後続 マイナーレベル は、同じメジャーバージョンへの変更 ( 後方互換性のあるAPI追加/変更"。 )

たとえば、1.2.0 から始まって 1.3.0 未満の 1.2.x ツリーでのパッチレベルの変更をすべて受け入れることを示すには、次のようにします。

"angular": "~1.2"
  or:
"angular": "~1.2.0"

また、これは .x の構文があります。

"angular": "1.2.x"

しかし、チルダ/を使うことで ~ の構文を使えば、さらに具体的になります。パッチレベルの変更しか認めない場合は 1.2.4から 1.3.0より小さい場合は、次のようになります。

"angular": "~1.2.4"

左に移動して メジャー バージョンを使用すると...

"angular": "~1"

...と同じです。

"angular": "1.x"
  or:
"angular": "^1.0.0"

...そして、1.0.0 以上 2.0 未満のマイナーレベルあるいはパッチレベルの変更にマッチします。

上記の最後のバリエーションに注目してください。 'キャレットレンジ' . キャレットは > という意味で、「どのバージョンでもよい」という意味だと考えてもよいでしょう。 よりも大きい 1.0.0"。(確かに滑ったことがあります。)いやいや!

キャレットレンジは、基本的に「気になる」という意味で使われます。 だけ そして、その左端の桁に影響を与えないマイナーレベルまたはパッチレベルの変更は許可する、ということです。しかし、メジャーバージョンを指定するチルダ範囲とは異なり、キャレット範囲ではマイナー/パッチの開始点を正確に指定することができます。つまり ^1.0.0 === ~1 のようなキャレットの範囲になります。 ^1.2.3 を使えば、どんな変更でも受け入れると言うことができます。 >=1.2.3 && <2.0.0 . チルダレンジではできなかったことですね。

近くで見ると、最初は分かりにくいかもしれませんね。でも、ちょっとズームアウトして、こんなふうに考えてみてください。 キャレットを使えば、有効数字が左から何番目であるかを気にすることができます。チルダは、右端の桁に最も関心があることを表します。 あとは細かいところですね。

チルダとキャレットの表現力の高さが、よりシンプルな .x の構文は、より多くのことを可能にします。そのため、チルダがよく使われます。 .x となります。例えば、npm自身を見てみましょう。npm自身のpackage.jsonファイルには、多くの依存関係があり、その依存関係は ~2.4.0 形式ではなく 2.4.x フォーマットで かもしれない を使用します。にこだわることで ~ この構文は、70以上のバージョンの依存関係のリストで、どの開始パッチ番号が受け入れられるかに関係なく、ずっと一貫しています。

いずれにせよ、SemVerにはまだ多くの魅力がありますが、ここではそのすべてを紹介することは避けます。詳細は ノード semver パッケージの readme . そして を必ず使用してください。 セマンティックバージョニング計算機 を練習し、SemVerがどのように機能するかを理解しようとしている間に。


RE: 連続しないバージョン番号 OPの最後の質問は、連続しないバージョン番号/範囲を指定することについてのようです(私が公正に編集した場合)。はい、一般的なダブルパイプの "or" 演算子を使用して、それが可能です。 || . こんな感じで。

"angular": "1.2 <= 1.2.9 || >2.0.0"