Bower ermöglicht es mir, Versionsanforderungen für Pakete mit der folgenden Syntax anzugeben:
"dependencies": {
"<name>": "<version>",
},
Aber ich konnte nicht finden, welche Syntax für die zu verwenden ist <version>
. Ich weiß, dass ich folgende Versionen angeben kann:
- größer als eine bestimmte Version mit
">1.0.0"
- größer oder gleich einer Version:
">=1.0.0"
- oder in einem bestimmten Bereich:
"1.0.0 - 2.0.0"
.
Ich weiß auch, dass es eine gemeinsame Versionssyntax gibt, die die Tilde enthält: "~1.0.0"
. Aber ich bin mir nicht sicher, was es bedeutet und ob es dasselbe ist wie "=1.0.0"
.
Ich bin auch daran interessiert zu wissen, ob ich mehrere nicht aufeinanderfolgende Versionen angeben kann, z. B. genau 1.0.3
Plus-Versionen größer als 1.5.0
etc…
Kurz gesagt, die Syntax für Bower-Versionsnummern (und NPMs) heißt SemVer, was die Abkürzung für „Semantic Versioning“ ist. Eine Dokumentation zur detaillierten Syntax von SemVer, wie sie in Bower und NPM verwendet wird, finden Sie in der API für der Semver-Parser in Node/npm. Sie können mehr über die zugrunde liegende Spezifikation erfahren (die dies tut nicht nennen ~
oder andere Syntaxdetails) at semver.org.
Da ist ein superpraktischer visueller Semver-Rechner Sie können damit spielen, was das Groken und Testen all dessen viel einfacher macht.
SemVer ist nicht nur eine Syntax! Es gibt einige ziemlich interessante Dinge über die richtigen Wege zur Veröffentlichung von APIs zu sagen, die helfen werden, die Bedeutung der Syntax zu verstehen. Entscheidend:
Sobald Sie Ihre öffentliche API identifiziert haben, teilen Sie Änderungen daran mit bestimmten Erhöhungen Ihrer Versionsnummer mit. Betrachten Sie ein Versionsformat von XYZ (Major.Minor.Patch). Fehlerbehebungen, die sich nicht auf die API auswirken, erhöhen die Patch-Version, abwärtskompatible API-Ergänzungen/-Änderungen erhöhen die Nebenversion und abwärtsinkompatible API-Änderungen erhöhen die Hauptversion.
Also, Ihre konkrete Frage bzgl ~
bezieht sich auf dieses Major.Minor.Patch-Schema. (Wie auch der zugehörige Caret-Operator ^
.) Sie können verwenden ~
um die Auswahl an Versionen einzuschränken, die Sie akzeptieren möchten:
- anschließend Patch-Level Änderungen an derselben Nebenversion (“Fehlerbehebungen, die die API nicht betreffen”), oder:
- anschließend Unterstufe Änderungen an derselben Hauptversion (“abwärtskompatible API-Ergänzungen/-Änderungen”)
Beispiel: Um anzuzeigen, dass Sie alle nachfolgenden Patch-Level-Änderungen am 1.2.x-Baum vornehmen werden, beginnend mit 1.2.0, aber weniger als 1.3.0, könnten Sie Folgendes verwenden:
"angular": "~1.2"
or:
"angular": "~1.2.0"
Dadurch erhalten Sie auch die gleichen Ergebnisse wie bei der Verwendung von .x
Syntax:
"angular": "1.2.x"
Aber Sie können die Tilde/~
Syntax, um noch genauer zu sein: wenn Sie nur bereit sind, Änderungen auf Patch-Ebene zu akzeptieren ab 1.2.4aber immer noch kleiner als 1.3.0, würden Sie Folgendes verwenden:
"angular": "~1.2.4"
Bewegen Sie sich nach links, in Richtung der Haupt Version, wenn Sie verwenden …
"angular": "~1"
… es ist dasselbe wie …
"angular": "1.x"
or:
"angular": "^1.0.0"
…und stimmt mit allen geringfügigen oder Patch-Level-Änderungen über 1.0.0 und unter 2.0 überein:
Beachten Sie die letzte Variante oben: Sie heißt a ‘Caret-Bereich’. Das Caret sieht sehr nach a aus >
also wäre es entschuldigt zu denken, dass es “jede Version” bedeutet größer als 1.0.0″. (Da bin ich sicherlich ausgerutscht.) Nö!
Caret-Bereiche werden im Grunde genommen verwendet, um auszudrücken, dass Sie sich interessieren nur über die am weitesten links stehende Ziffer – normalerweise die Hauptversion – und dass Sie alle geringfügigen oder Patch-Level-Änderungen zulassen, die diese Ziffer ganz links nicht betreffen. Im Gegensatz zu einem Tilde-Bereich, der eine Hauptversion angibt, können Sie mit Caret-Bereichen jedoch einen genauen Startpunkt für Minor/Patch angeben. Also, während ^1.0.0 === ~1
ein Caret-Bereich wie z ^1.2.3
lässt Sie sagen, dass Sie alle Änderungen vornehmen werden >=1.2.3 && <2.0.0
. Mit einer Tilde-Range wäre das nicht möglich.
Das alles wirkt zunächst verwirrend, wenn man es aus der Nähe betrachtet. Aber zoomen Sie für eine Sekunde heraus und denken Sie so darüber nach: Mit dem Caret-Zeichen können Sie einfach sagen, dass Sie sich am meisten um die signifikante Ziffer am weitesten links kümmern. Mit der Tilde können Sie sagen, dass Sie sich am meisten Gedanken darüber machen, welche Ziffer am weitesten rechts steht. Der Rest sind Details.
Es ist die Ausdruckskraft der Tilde und des Caretzeichens, die erklärt, warum die Leute sie viel häufiger verwenden als die einfacheren .x
Syntax: Sie lassen Sie einfach mehr tun. Deshalb werden Sie die Tilde oft auch dort sehen, wo sie verwendet wird .x
dienen würde. Als Beispiel siehe npm selbst: Die eigene Datei package.json enthält viele Abhängigkeiten ~2.4.0
Format, anstatt das 2.4.x
formatieren Sie es könnte verwenden. Indem man sich daran hält ~
ist die Syntax über eine Liste von mehr als 70 versionierten Abhängigkeiten hinweg konsistent, unabhängig davon, welche Anfangs-Patch-Nummer akzeptabel ist.
Wie auch immer, es gibt noch mehr zu SemVer, aber ich werde hier nicht versuchen, alles im Detail zu beschreiben. Überprüfen Sie es auf der readme des node semver-Pakets. Und verwenden Sie unbedingt die Rechner für semantische Versionierung während Sie üben und versuchen, sich mit der Funktionsweise von SemVer vertraut zu machen.
RE: Nicht fortlaufende Versionsnummern: Die letzte Frage von OP scheint die Angabe nicht fortlaufender Versionsnummern / -bereiche zu sein (wenn ich sie fair bearbeitet habe). Ja, Sie können das tun, indem Sie den üblichen Doppel-Pipe-Operator “or” verwenden: ||
. So:
"angular": "1.2 <= 1.2.9 || >2.0.0"
Bezogen auf halbwegskönnen Sie verwenden
-
Bindestrich Bereiche XYZ – ABC
1.2.3-2.3.4
Zeigt an >=1.2.3 <=2.3.4
-
X-Bereiche
1.2.x
1.X
1.2.*
-
Tilde-Ketten
~1.2.3
~1.2
Zeigt an, dass Patch-Level-Änderungen oder kleinere Versionsänderungen zugelassen werden.
-
Caret-Bereiche ^1.2.3 ^0.2.5 ^0.0.4
Lässt Änderungen zu, die die am weitesten links stehende Ziffer ungleich Null in der nicht ändern [major, minor, patch] Tupel
^1.2.x
(bedeutet >=1.2.0 <2.0.0)
^0.0.x
(bedeutet >=0.0.0 <0.1.0)
^0.0
(bedeutet >=0.0.0 <0.1.0)
Bower verwendet Semver-Syntaxaber hier sind ein paar kurze Beispiele:
Sie können eine bestimmte Version installieren:
$ bower install jquery#1.11.1
Sie können ~ verwenden, um ‘jede Version, die damit beginnt’ anzugeben:
$ bower install jquery#~1.11
Sie können mehrere Versionsanforderungen zusammen angeben:
$ bower install "jquery#<2.0 >1.10"
Sie können auch die verwenden latest
Schlüsselwort, um die neueste verfügbare Version zu installieren:
"dependencies": {
"fontawesome": "latest"
}
Wenn es keine Patchnummer gibt, ~
ist gleichbedeutend mit Anhängen .x
zur Nicht-Tilde-Version. Wenn es eine Patchnummer gibt, ~
erlaubt alle Patch-Nummern >= die angegebene.
~1 := 1.x
~1.2 := 1.2.x
~1.2.3 := (>=1.2.3 <1.3.0)
Ich habe nicht genug Punkte, um die akzeptierte Antwort zu kommentieren, aber einige der Tilde-Informationen stehen im Widerspruch zur verlinkten Semver-Dokumentation: "angular": "~1.2"
Wille nicht Übereinstimmung 1.3, 1.4, 1.4.9. Ebenfalls "angular": "~1"
und "angular": "~1.0"
sind nicht gleichwertig. Dies kann mit überprüft werden npm semver Rechner.
Dies könnte ein Duplikat von stackoverflow.com/a/19040351/537738 sein
– David
27. September 2013 um 13:27 Uhr