web-dev-qa-db-ja.com

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

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.31.5.0より大きいバージョンなど、連続していない複数のバージョンを指定できるかどうかも知りたいです。

270
Samuel Hapak

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

非常に便利なビジュアルsemver計算機 があり、これを使って、これらすべてを簡単に理解してテストすることができます。

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

パブリックAPIを特定したら、バージョン番号に特定の増分を加えて、変更を通知します。 X.Y.Z(Major.Minor.Patch)のバージョン形式を検討してください。 APIに影響を与えないバグ修正はパッチバージョンを増分し、後方互換性のあるAPIの追加/変更はマイナーバージョンを増分し、後方互換性のないAPIの変更はメジャーバージョンを増分します。

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

  • 同じマイナーバージョンへの後続のパッチレベル変更("APIに影響しないバグ修正")、または:
  • 同じメジャーバージョンへの後続のminor-level変更("後方互換性のある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"

使用している場合は、majorバージョンに向かって左に移動します...

"angular": "~1"

...と同じです...

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

...また、1.0.0以上で2.0未満のマイナーレベルまたはパッチレベルの変更に一致します。

上記の最後のバリエーションに注意してください:'キャレット範囲'と呼ばれます。キャレットは>に非常によく似ているため、「任意のバージョンgreater than1.0.0」を意味すると考えるのは許されないでしょう。 (私は確かにそれを滑らせました。)いいえ!

キャレット範囲は基本的に、左端の有効数字(通常はメジャーバージョン)についてonlyを気にし、それ以外のマイナーレベルまたはパッチレベルの変更を許可すると言うために使用されます。 tはその左端の数字に影響します。ただし、メジャーバージョンを指定するチルダ範囲とは異なり、キャレット範囲を使用すると、正確なマイナー/パッチの開始点を指定できます。そのため、^1.0.0 === ~1の間に、^1.2.3などのキャレット範囲を使用すると、>=1.2.3 && <2.0.0に変更を加えることができます。チルダ範囲ではできませんでした。

それを間近で見ると、最初はすべて混乱しているように見えます。しかし、少しズームアウトして、次のように考えてみてください:キャレットは、最も重要な数字が一番左にあることを最も心配していると言うことができます。チルダを使用すると、右端の数字に最も関心があると言うことができます。残りは詳細です。

チルダとキャレットの表現力が、人々が単純な.x構文よりもはるかに多く使用する理由を説明しています。そのため、.xが表示される場所でもチルダが頻繁に使用されることがわかります。例として、npm自体を参照してください。独自のpackage.jsonファイルには、couldを使用する~2.4.0形式ではなく、2.4.x形式の多くの依存関係が含まれています。 ~に固執することにより、構文は、どの開始パッチ番号が受け入れられるかに関係なく、70以上のバージョン付き依存関係のリスト全体で一貫しています。

とにかく、SemVerにはまだまだありますが、ここではすべてを詳しく説明するつもりはありません。 node semverパッケージのreadme で確認してください。そしてSemVerがどのように動作するかを練習して頭を動かそうとしている間は、必ず semantic versioning calculatorを使用してください。


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

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

semver に基づいて、あなたは使用することができます

  • ハイフン範囲X.Y.Z - A.B.C1.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)
137
Jerome Anthony

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

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

$ bower install jquery#1.11.1

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

$ bower install jquery#~1.11

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

$ bower install "jquery#<2.0 >1.10"
75
Wilfred Hughes

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

  "dependencies": {
    "fontawesome": "latest"
  }
13
shacker

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

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

私は受け入れられた答えについてコメントするのに十分なポイントを持っていませんが、チルダ情報の一部はリンクされたsemverドキュメントと矛盾しています:"angular": "~1.2" willnot1.3、1.4、1.4.9に一致します。また、"angular": "~1""angular": "~1.0"notと同等です。これは npm semver calculator で確認できます。

7
Decima