Was ist die Version der bower (und npm) Version?

Bower ermöglicht es mir, die Versionsanforderungen für Pakete mit der folgenden Syntax anzugeben:

"dependencies": { "": "", }, 

Ich konnte jedoch nicht herausfinden, welche Syntax für die . Ich weiß, dass ich 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 das gleiche wie "=1.0.0" .

Ich bin auch interessiert zu wissen, ob ich in der Lage bin, mehrere nicht aufeinanderfolgende Versionen, wie genau 1.0.3 plus Versionen größer als 1.5.0 usw. zu spezifizieren.

Kurz gesagt, die Syntax für Bower-Versionsnummern (und NPMs) heißt SemVer, kurz für Semantic Versioning. Sie finden eine Dokumentation für die detaillierte Syntax von SemVer, wie sie in Bower und NPM in der API für den sverver-Parser innerhalb von Node / npm verwendet wird . Sie können mehr über die zugrunde liegende Spezifikation (die ~ oder andere Syntaxdetails nicht erwähnt) auf semver.org erfahren .

Es gibt einen super handlichen visuellen Rechner, mit dem du spielen kannst, um all das viel einfacher zu machen und zu testen.

SemVer ist nicht nur eine Syntax! Es gibt einige ziemlich interessante Dinge über die richtigen Wege, APIs zu veröffentlichen, die helfen werden zu verstehen, was die Syntax bedeutet. Entscheidend:

Sobald Sie Ihre öffentliche API identifiziert haben, kommunizieren Sie Änderungen in bestimmten Schritten an Ihre Versionsnummer. Betrachten Sie ein Versionsformat von XYZ (Major.Minor.Patch) . Fehlerbehebungen, die die API nicht beeinflussen, erhöhen die Patch-Version, rückwärtskompatible API-Zusätze / Änderungen inkrementieren die Nebenversion und rückwärts inkompatible API-Änderungen erhöhen die Hauptversion.

Ihre spezifische Frage zu ~ bezieht sich auf das Major.Minor.Patch-Schema. (Dies gilt auch für den zugehörigen Caret-Operator ^ .) Sie können ~ um den Bereich der Versionen, die Sie akzeptieren möchten, auf Folgendes zu beschränken:

  • nachfolgende Änderungen auf der Patch-Ebene in der gleichen Nebenversion ( “Fehlerbehebungen, die die API nicht beeinflussen” ), oder:
  • spätere geringfügige Änderungen an derselben Hauptversion ( “abwärtskompatible API-Ergänzungen / Änderungen” )

Beispiel: Um anzuzeigen, dass Sie in der 1.2.x-Struktur alle nachfolgenden Änderungen auf Patch-Ebene vornehmen, beginnend mit 1.2.0, jedoch unter 1.3.0, können Sie Folgendes verwenden:

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

Dadurch erhalten Sie auch die gleichen Ergebnisse wie mit der .x Syntax:

 "angular": "1.2.x" 

Sie können jedoch die Tilde / ~ Syntax verwenden, um noch spezifischer zu sein: Wenn Sie nur Änderungen auf Patch-Ebene zulassen möchten , die mit 1.2.4 beginnen , aber immer noch weniger als 1.3.0, verwenden Sie Folgendes:

 "angular": "~1.2.4" 

Bewegen Sie sich nach links, in Richtung der Hauptversion , wenn Sie … verwenden

 "angular": "~1" 

… es ist dasselbe wie …

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

… und passt alle Änderungen auf Minor- oder Patch-Ebene über 1.0.0 und weniger als 2.0 an:

Beachten Sie, dass die letzte Variation oben: es ist ein ‘Caret-Bereich’ genannt . Das Caret sieht sehr ähnlich aus wie ein > , also würden Sie sich entschuldigen, wenn Sie denken, es bedeutet “jede Version größer als 1.0.0″. (Ich bin sicherlich darauf gestoßen.) Nein!

Caret-Bereiche werden im Wesentlichen verwendet, um zu sagen, dass Sie nur an der am weitesten links stehenden Ziffer interessiert sind – normalerweise an der Hauptversion – und dass Sie geringfügige Änderungen oder Änderungen auf Patch-Ebene zulassen, die die Ziffer ganz links nicht beeinflussen. Im Gegensatz zu einem Tilde-Bereich, der eine Hauptversion angibt, können Sie jedoch mithilfe der Einfügemarkebereiche einen präzisen Neben- / Patch-Startpunkt angeben. Während also ^1.0.0 === ~1 , können Sie mit einem Caret-Bereich wie ^1.2.3 sagen, dass Sie Änderungen vornehmen >=1.2.3 && <2.0.0 . Das konnte mit einem Tilde-Bereich nicht gemacht werden.

Das wirkt zunächst alles verwirrend, wenn man es aus der Nähe betrachtet. Aber zoomen Sie eine Sekunde aus und denken Sie so darüber nach: Der Caret lässt Sie einfach sagen, dass Sie sich am meisten Sorgen darum machen, welche signifikante Ziffer am weitesten links ist. Die Tilde lässt Sie sagen, dass Sie am meisten besorgt sind, welche Ziffer am rechten ist. Der Rest ist Detail.

Es ist die expressive Kraft der Tilde und des Caret, die erklärt, warum Menschen sie viel mehr als die einfachere .x Syntax verwenden: Sie lassen Sie einfach mehr tun. Aus diesem Grund wird die verwendete Tilde oft auch dort .x wo .x dienen würde. Als Beispiel siehe npm selbst: seine eigene package.json-Datei enthält viele Abhängigkeiten im ~2.4.0 Format und nicht das 2.4.x Format, das sie verwenden könnte . Wenn Sie bei ~ bleiben, ist die Syntax konsistent bis in eine Liste von mehr als 70 versionierten Abhängigkeiten, unabhängig davon, welche Anfangs-Patch-Nummer akzeptabel ist.

Wie auch immer, es gibt noch mehr bei SemVer, aber ich werde nicht versuchen, hier alles zu beschreiben. Überprüfen Sie es in der readme des Knoten semver Pakets . Stellen Sie sicher, dass Sie den semantischen Versionierungsrechner verwenden, während Sie üben und versuchen, sich mit der functionsweise von SemVer vertraut zu machen.


RE: Nicht fortlaufende Versionsnummern: OPs letzte Frage scheint zu sein, nicht-konsekutive Versionsnummern / -bereiche zu spezifizieren (wenn ich es ziemlich redigiert habe). Ja, Sie können das tun, indem Sie den Doppeloperator "oder" verwenden: || . Wie so:

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

Basierend auf semver , können Sie verwenden

  • Bindestrichbereiche 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 Ranges ~1.2.3 ~1.2 Zeigt an, dass Patch-Level-Änderungen oder kleinere Versionsänderungen erlaubt sind.

  • Caret-Bereiche ^ 1.2.3 ^ 0.2.5 ^ 0.0.4

    Erlaubt Änderungen, die nicht die am weitesten links liegende Ziffer ungleich Null im Tupel [major, minor, patch] ändern

    • ^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 die Semver-Syntax , hier jedoch einige 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 das latest Schlüsselwort verwenden, um die neueste verfügbare Version zu installieren:

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

Wenn es keine Patch-Nummer gibt, entspricht ~ dem .x von .x zur Nicht-Tilde-Version. Wenn es eine Patch-Nummer 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 genügend Punkte, um die akzeptierte Antwort zu kommentieren, aber einige der Tilde-Informationen stehen im Widerspruch zu der verknüpften semver-Dokumentation: "angular": "~1.2" wird nicht mit 1.3, 1.4, 1.4.9 übereinstimmen. Auch "angular": "~1" und "angular": "~1.0" sind nicht gleichwertig. Dies kann mit dem npm semver-Rechner verifiziert werden .