Wie lautet die Syntax der Bower- (und Npm-) Version?

274

Mit Bower kann ich Versionsanforderungen für Pakete mithilfe der folgenden Syntax angeben:

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

Aber ich konnte nicht finden, welche Syntax für das verwendet werden soll <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 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 interessiert zu wissen, ob ich mehrere nicht aufeinanderfolgende Versionen angeben kann, z. B. genau 1.0.3plus Versionen größer als 1.5.0usw.

Samuel Hapak
quelle
3
Dies könnte ein Duplikat von stackoverflow.com/a/19040351/537738
David

Antworten:

341

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 .xSyntax:

"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 === ~1ein caret Bereich wie ^1.2.3kö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 .xSyntax: Sie lassen Sie einfach mehr tun. Deshalb werden Sie sehen, dass die Tilde oft verwendet wird, selbst wenn .xsie dienen würde. Ein Beispiel finden Sie unter npm selbst: Die eigene Datei package.json enthält viele Abhängigkeiten im ~2.4.0Format und nicht das 2.4.xFormat, 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"
XML
quelle
27
Dies ~bedeutet insbesondere, dass die Patch- (dritte) Nummer größer sein kann als die angegebene, z . B. ~1.2.3äquivalent zu >=1.2.3 <1.3.0.
z0r
1
Kann auch für die kleine (zweite) Nummer verwendet werden, je nach den oben angegebenen Änderungen.
XML
Interessant ist, dass die SemVer-Dokumentation auch die x-Notation zuzulassen scheint (was für Menschen viel intuitiver ist).
Frank Nocke
2
Die x-Notation ist zunächst intuitiv zu lesen, aber viel weniger flexibel. Zum Beispiel '1.1.x' === '>=1.1.0' === '~1.1.0'. Der Fall 1.1.0 ist einfach. Aber die X-Notation kann nicht granular sein, wie '>=1.1.4'oder '~1.1.4'. Dann landen Sie '1.1.x'an einer Stelle in Ihrer Abhängigkeitsliste und '~2.7.3'an einer anderen Stelle. Das ist in Ordnung und funktioniert, aber ein Entwickler muss dann mehrere Syntaxen analysieren, um eine einzelne Liste zu lesen. Wenn Sie Pakete schreiben, um die Version programmgesteuert festzulegen, möchten Sie eine einzige Syntax. Und die meisten Leute wollen verhindern, dass Änderungen brechen. Daher sind alle Probleme mit gelöst ~.
XML
1
Hah. Ich denke, "grok" ist weniger geografisch als das von Nerds beleuchtete kulturelle (und möglicherweise altersbedingte) @Clonkex. Für zukünftige Leser: Es ist ein Hinweis auf Heinleins Fremden in einem fremden Land ...
XML
141

Basierend auf Semver können Sie verwenden

  • Bindestrichbereiche XYZ - ABC 1.2.3-2.3.4 Zeigt > = 1.2.3 <= 2.3.4 an

  • X-Bereiche 1.2.x 1.X 1.2.*

  • Tilde-Bereiche ~1.2.3 ~1.2 Gibt an, dass Änderungen auf Patch-Ebene oder kleinere Versionsänderungen zulässig sind.

  • Caret-Bereiche ^ 1.2.3 ^ 0.2.5 ^ 0.0.4

    Ermöglicht Änderungen, bei denen die am weitesten links stehende Ziffer ungleich Null im Tupel [Dur, Moll, Patch] nicht geändert wird

    • ^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)
Jerome Anthony
quelle
21
Vielen Dank für die unsinnige, leicht zu lesende Antwort. Ich musste nicht zurückverfolgen oder so, nur Boom, da ist die Antwort. Gut gemacht;)
Toddmo
76

Bower verwendet die Semver-Syntax , aber hier einige kurze Beispiele:

Sie können eine bestimmte Version installieren:

$ bower install jquery#1.11.1

Mit ~ können Sie 'jede Version angeben, die damit beginnt':

$ bower install jquery#~1.11

Sie können mehrere Versionsanforderungen zusammen angeben:

$ bower install "jquery#<2.0 >1.10"
Wilfred Hughes
quelle
1
Ich bin gespannt auf die praktische Anwendung. Roulette-Installation?
gravidThoughts
Ein Blick auf die Antwort von @ XMLilley (und die Semver-Dokumente) "Start's with" scheint falsch zu sein, da 1.12, 1.13 auch in Ordnung wären, solange die Hauptversion nicht hochgeht ...
Frank Nocke
13

Sie können auch das latestSchlüsselwort verwenden, um die neueste verfügbare Version zu installieren:

  "dependencies": {
    "fontawesome": "latest"
  }
Shacker
quelle
1
semver erwähnt das nicht. Wo haben Sie festgestellt, dass es gültig ist? :) Es heißt " "*" := >=0.0.0(Jede Version ist zufriedenstellend)", was nah, aber ein bisschen vage ist, da es nicht ausdrücklich das Neueste sagt, also könnte es das erste sein, das es findet?
GazB
Um ehrlich zu sein, es war nur Versuch und Irrtum - ich habe es versucht und es hat funktioniert! Sie können richtig sein, dass es nicht 100% gültig ist, aber es funktioniert.
Shacker
7

Wenn keine Patch-Nummer vorhanden ~ist, entspricht dies dem Anhängen .xan die Nicht-Tilde-Version. Wenn eine Patch-Nummer vorhanden ist, sind ~alle Patch-Nummern> = die angegebene zulässig.

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

Ich habe nicht genug Punkte , um kommentiert die akzeptierte Antwort, aber einige der Tilde Informationen stehen im Widerspruch mit den semver Dokumentation verknüpft: "angular": "~1.2"wird nicht 1.3 entsprechen, 1.4, 1.4.9. Auch "angular": "~1"und "angular": "~1.0"sind nicht gleichwertig. Dies kann mit dem npm semver-Rechner überprüft werden .

Decima
quelle