バウアー(およびnpm)バージョンの構文とは何ですか?


274

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です。


3
これは、stackoverflow.com
David

回答:


341

簡単に言うと、Bowerのバージョン番号(およびNPMのバージョン)の構文はSemVerと呼ばれ、「セマンティックバージョニング」の略です。Node / npm内のsemverパーサーの APIのBowerおよびNPMで使用されるSemVerの詳細な構文のドキュメントを見つけることができます。semver.orgで、基本的な仕様(言及されていない、~またはその他の構文の詳細)について詳しく学ぶことができます。

あります、超便利な視覚的semver計算 GROKとテストにはるかに簡単にこのすべてを作り、あなたがで遊ぶことができますが、。

SemVerは単なる構文ではありません!構文の意味を理解するのに役立つ、APIを公開する正しい方法について言うことは、かなり興味深いことがいくつかあります。重要なこと:

パブリックAPIを特定したら、バージョン番号の特定の増分でAPIへの変更を伝えます。XYZ(Major.Minor.Patch)のバージョン形式を検討してください。APIに影響しないバグ修正により、パッチバージョンが増加し、下位互換性のあるAPIの追加/変更によりマイナーバージョンが増加し、下位互換性のないAPI変更によりメジャーバージョンが増加します。

だから、あなた~に関する特定の質問は、そのMajor.Minor.Patchスキーマに関連しています。(関連するキャレット演算子も同様^です。)を使用~して、受け入れるバージョンの範囲を次のいずれかに狭めることができます。

  • 同じマイナーバージョンへのその後のパッチレベルの変更(「APIに影響しないバグ修正」)、または:
  • 同じメジャーバージョンに対する後続のマイナーレベルの変更(「下位互換性のあるAPIの追加/変更」

たとえば、1.2.x以降、1.2.0から1.3.0未満のパッチレベルの変更を行うことを示すには、次のように使用できます。

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

これにより、.x構文を使用した場合と同じ結果が得られます。

"angular": "1.2.x"

ただし、tilde / ~構文を使用してさらに具体的にすることができます。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。チルダ範囲ではこれを行うことはできません。

間近で見ると、最初は混乱するようです。しかし、1秒間ズームアウトして、このように考えてください。キャレットでは、左端の有効数字が最も心配されていると簡単に言うことができます。チルダを使用すると、最も右にある数字に最も関心があると言えます。残りは詳細です。

ティルダとキャレットの表現力は、人々が単純な.x構文よりもはるかに多く使用する理由を説明しています。だからこそ、どこで.x役立つチルダも頻繁に使用されます。例として、NPM自体を参照してください。独自のpackage.jsonファイルは、中の依存関係がたくさん含まれて~2.4.0ではなく、フォーマットを2.4.x、それがフォーマット可能性があります。に固執すること~で、どの開始パッチ番号が許容可能であるかに関係なく、構文は70以上のバージョン付き依存関係のリスト全体にわたって一貫しています。

とにかく、SemVerにはまだまだありますが、ここでは詳しく説明しません。ノードsemverパッケージのreadmeで確認してください。また SemVerがどのように機能するかを練習して頭を動かそうとしている間は、必ずセマンティックバージョニング計算機を使用してください。


RE:連続していないバージョン番号:OPの最後の質問は、連続していないバージョン番号/範囲を指定することです(私がそれをかなり編集した場合)。はい、一般的な二重パイプの「または」演算子を使用して、それを行うことができます||。そのようです:

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

27
したがって~、特に、パッチ(3番目)の番号は、指定した番号よりも大きくなる可能性があることを~1.2.3意味し>=1.2.3 <1.3.0ます。
z0r 2014年

1
上記のインライン編集ごとに、マイナー(2番目)番号にも使用できます。
XML

興味深いことに、SemVerのドキュメントではx表記(人間にとってははるかに直感的)も許可されているようです。
Frank Nocke

2
x-notationは、最初は直感的に読むことができますが、柔軟性に欠けます。例えば、'1.1.x' === '>=1.1.0' === '~1.1.0'。1.1.0のケースは簡単です。ただし、x表記は、'>=1.1.4'またはのように細かくすることはできません'~1.1.4'。したがって、'1.1.x'依存関係リストの1つの場所と'~2.7.3'別の場所でまとめることになります。これは問題なく機能しますが、開発者は単一のリストを読み取るために複数の構文を解析する必要があります。また、プログラムでバージョンを設定するパッケージを作成する場合は、単一の構文が必要です。そして、ほとんどの人々は破壊的な変更を防ぎたいと思っています。したがって、すべての問題がで解決されました~
XMLの

1
ああ。"grok"は、オタクに照らされた文化的(そしておそらく年齢に関連する)@Clonkexよりも地理的ではないと思います。将来の読者のために:それは奇妙な土地のハインラインの見知らぬ人への参照です...
XML

141

semverに基づいて、使用できます

  • ハイフンの範囲XYZ-ABCは > = 1.2.3 <= 2.3.4 1.2.3-2.3.4 を示します

  • X範囲 1.2.x 1.X 1.2.*

  • チルダ範囲 ~1.2.3 ~1.2 パッチレベルの変更またはマイナーバージョンの変更を許可することを示します。

  • キャレット範囲^ 1.2.3 ^ 0.2.5 ^ 0.0.4

    [メジャー、マイナー、パッチ]タプルの左端のゼロ以外の数字を変更しない変更を許可します

    • ^1.2.x (平均> = 1.2.0 <2.0.0)
    • ^0.0.x (平均> = 0.0.0 <0.1.0)
    • ^0.0 (平均> = 0.0.0 <0.1.0)

21
意味のない、読みやすい答えをありがとう。追跡する必要はありませんでした。ただ、ブーム、答えがあります。よくやった;)
toddmo

76

Bowerはsemver構文を使用していますが、簡単な例をいくつか示します。

特定のバージョンをインストールできます。

$ bower install jquery#1.11.1

〜を使用して、「これで始まるすべてのバージョン」を指定できます。

$ bower install jquery#~1.11

複数のバージョン要件を一緒に指定できます。

$ bower install "jquery#<2.0 >1.10"

1
これの実用化に興味があります。ルーレットのインストール?
gravidThoughts 2015

メジャーバージョンが上がるしないよう1.12、1.13も、限り、大丈夫だろうとXMLilleyの答え(およびsemverドキュメント)@を見てみると「スタートのと」...、間違っているようだ
フランクNocke

13

latestキーワードを使用して、入手可能な最新バージョンをインストールすることもできます。

  "dependencies": {
    "fontawesome": "latest"
  }

1
semverはこれについて言及していません。それが有効であることをどこで確立しましたか?:)「"*" := >=0.0.0(すべてのバージョンが満たす)」と言っているのは近いですが、具体的には最新とは言わないので少し曖昧なので、最初に見つかった可能性がありますか?
GazB 2016年

正直なところ、それは試行錯誤でした-私はそれを試してみましたが、うまくいきました!100%有効ではないかもしれませんが、動作します。
シャッカー2016年

7

パッチ番号がない場合は、チルド以外のバージョン~に追加することと同じ.xです。パッチ番号がある場合~、指定したパッチ番号以上のすべてのパッチ番号を許可します。

~1     := 1.x
~1.2   := 1.2.x
~1.2.3 := (>=1.2.3 <1.3.0)

受け入れられた回答についてコメントするのに十分なポイントはありませんが、いくつかのチルダ情報は、リンクされたsemverのドキュメントと矛盾しています。1.3、1.4、1.4.9 "angular": "~1.2"一致しません。また"angular": "~1"、同等で"angular": "~1.0"はありません。これは、npm semver計算機で確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.