Kurz gesagt, die Syntax für Bower-Versionsnummern (und NPMs) heißt SemVer, was für 'Semantic Versioning' steht. Eine Dokumentation zur detaillierten Syntax von SemVer, wie sie in Bower und NPM verwendet wird, finden Sie in der API für den Semver-Parser in Node / npm . Sie können mehr über den zugrunde liegenden spec lernen (was nicht nicht erwähnen ~
oder andere Syntax Details) bei semver.org .
Es gibt einen super praktischen visuellen Semver-Rechner, mit dem Sie spielen können, was das Groken und Testen erheblich erleichtert.
SemVer ist nicht nur eine Syntax! Es gibt einige ziemlich interessante Dinge zu sagen, wie APIs richtig veröffentlicht werden können, um zu verstehen, was die Syntax bedeutet. Entscheidend:
Sobald Sie Ihre öffentliche API identifiziert haben, teilen Sie Änderungen mit bestimmten Schritten zu 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ärtskompatible API-Änderungen erhöhen die Hauptversion.
Ihre spezielle Frage zu ~
bezieht sich also auf dieses Major.Minor.Patch-Schema. (Wie auch der zugehörige Caret-Operator ^
.) Sie können verwenden~
den Bereich der Versionen, die Sie akzeptieren möchten, auf Folgendes eingrenzen:
- nachfolgende Änderungen auf Patch-Ebene auf dieselbe Nebenversion ( "Fehlerbehebungen, die die API nicht betreffen" ) oder:
- nachfolgende kleinere Änderungen an derselben Hauptversion ( "abwärtskompatible API-Ergänzungen / Änderungen") )
Beispiel: Um anzuzeigen, dass Sie alle nachfolgenden Änderungen auf Patch-Ebene am 1.2.x-Baum vornehmen, beginnend mit 1.2.0, jedoch weniger als 1.3.0, können Sie Folgendes verwenden:
"angular": "~1.2"
or:
"angular": "~1.2.0"
Dadurch erhalten Sie auch die gleichen Ergebnisse wie bei Verwendung der .x
Syntax:
"angular": "1.2.x"
Sie können die Tilde / ~
Syntax jedoch verwenden, um noch genauer zu sein: Wenn Sie nur Änderungen auf Patch-Ebene akzeptieren möchten , die mit 1.2.4 beginnen , aber immer noch unter 1.3.0 liegen, würden Sie Folgendes verwenden:
"angular": "~1.2.4"
Bewegen Sie sich nach links in Richtung der Hauptversion , wenn Sie ...
"angular": "~1"
... es ist das gleiche wie ...
"angular": "1.x"
or:
"angular": "^1.0.0"
... und entspricht allen geringfügigen Änderungen oder Änderungen auf Patch-Ebene über 1.0.0 und unter 2.0:
Beachten Sie die letzte Variation oben: Sie wird als "Caret-Bereich" bezeichnet . Das Caret sieht sehr nach einem aus >
, daher sollten Sie sich entschuldigen, dass es "jede Version größer als 1.0.0" bedeutet. (Darauf bin ich sicher ausgerutscht.) Nein!
Caret-Bereiche werden grundsätzlich verwendet, um zu sagen, dass Sie sich nur für die am weitesten links stehende Ziffer interessieren - normalerweise die Hauptversion - und dass Sie Änderungen auf kleinerer oder Patch-Ebene zulassen, die sich nicht auf diese am weitesten links stehende Ziffer auswirken. Im Gegensatz zu einem Tilde-Bereich, der eine Hauptversion angibt, können Sie in Caret-Bereichen einen genauen Moll- / Patch-Startpunkt angeben. So, während ^1.0.0 === ~1
ein caret Bereich wie ^1.2.3
können Sie sagen , Sie alle Änderungen übernehmen werde >=1.2.3 && <2.0.0
. Mit einem Tilde-Bereich konnte man das nicht machen.
Das alles scheint 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 können Sie einfach sagen, dass Sie sich am meisten Sorgen darüber machen, welche signifikante Ziffer am weitesten links steht. Mit der Tilde können Sie sagen, dass Sie sich am meisten Sorgen darüber machen, welche Ziffer am besten ist. Der Rest ist Detail.
Es ist die Ausdruckskraft der Tilde und des Carets, die erklärt, warum die Leute sie viel häufiger verwenden als die einfachere .x
Syntax: Sie lassen Sie einfach mehr tun. Deshalb werden Sie sehen, dass die Tilde oft verwendet wird, selbst wenn .x
sie dienen würde. Ein Beispiel finden Sie unter npm selbst: Die eigene Datei package.json enthält viele Abhängigkeiten im ~2.4.0
Format und nicht das 2.4.x
Format, das sie verwenden könnte . Wenn Sie sich an halten ~
, ist die Syntax in einer Liste von über 70 versionierten Abhängigkeiten konsistent, unabhängig davon, welche anfängliche Patch-Nummer akzeptabel ist.
Wie auch immer, SemVer hat noch mehr zu bieten, aber ich werde hier nicht versuchen, alles detailliert darzustellen. Überprüfen Sie es in der Readme-Datei des Node Semver-Pakets . Und achten Sie darauf , das verwenden semantische Versionierung Rechner , während Sie üben und versuchen , Ihren Kopf herum , wie SemVer funktioniert.
RE: Nicht aufeinanderfolgende Versionsnummern: Die letzte Frage von OP scheint darin zu bestehen, nicht aufeinanderfolgende Versionsnummern / -bereiche anzugeben (wenn ich sie fair bearbeitet habe). Ja, Sie können dies mit dem üblichen Doppelrohr-Operator "oder" tun : ||
. Wie so:
"angular": "1.2 <= 1.2.9 || >2.0.0"