Was ist die Bower- (und npm-) Versionssyntax?

Lesezeit: 6 Minuten

Benutzeravatar von Samuel Hapak
Samuel Hapak

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.0etc…

  • Dies könnte ein Duplikat von stackoverflow.com/a/19040351/537738 sein

    – David

    27. September 2013 um 13:27 Uhr

Benutzeravatar von XML
XML

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 === ~1ein 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"

  • So ~ bedeutet insbesondere, dass die (dritte) Patch-Nummer größer als die angegebene sein kann, z ~1.2.3 ist äquivalent zu >=1.2.3 <1.3.0.

    – z0r

    22. Oktober 2014 um 1:03 Uhr


  • Kann auch für die kleine (zweite) Nummer verwendet werden, pro Bearbeitung oben inline.

    – XML

    27. Juni 2015 um 11:32 Uhr

  • 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 1.1.0-Fall ist einfach. Aber die x-Notation kann nicht granular sein, wie es möglich ist '>=1.1.4' oder '~1.1.4'. Also, dann landest du bei '1.1.x' an einem Ort in Ihrer Abhängigkeitsliste und '~2.7.3' an einem anderen Ort. Das ist in Ordnung und funktioniert, aber ein Entwickler muss dann mehrere Syntaxen parsen, um eine einzelne Liste zu lesen. Und wenn Sie Pakete schreiben, um die Version programmgesteuert festzulegen, möchten Sie eine einzige Syntax. Und die meisten Leute möchten Breaking Changes verhindern. Somit sind alle Probleme mit gelöst ~.

    – XML

    11. Januar 2016 um 1:35 Uhr


  • "angular": "~1.2" Wille nicht Übereinstimmung 1.3, 1.4, 1.4.9. Ebenfalls "angular": "~1" und "angular": "~1.0" sind nicht gleichwertig. Testen Sie mit semver.npmjs.com

    – Decima

    21. März 2016 um 14:39 Uhr

  • Musste “grok” googeln. Es ist meiner Erfahrung nach kein Wort, das wir in Australien verwenden.

    – Clonkex

    2. Oktober 2017 um 23:54 Uhr

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)

  • Danke für die sachliche, leicht verständliche Antwort. Ich musste nicht zurückverfolgen oder so, nur, boom, da ist die Antwort. Gut erledigt 😉

    – Todmo

    9. August 2015 um 19:34 Uhr


Benutzeravatar von Wilfred Hughes
Wilfried Hughes

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"

  • Ich bin gespannt auf den praktischen Nutzen davon. Roulette-Installation?

    – gravidGedanken

    17. August 2015 um 20:36 Uhr

  • Wenn man sich die Antwort von @XMLilley (und Semver-Dokumente) ansieht, scheint ‘start’s with’ falsch zu sein, da 1.12, 1.13 auch in Ordnung wäre, solange die Hauptversion nicht hochgefahren wird …

    – Frank N

    10. Januar 2016 um 17:15 Uhr

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.

1436640cookie-checkWas ist die Bower- (und npm-) Versionssyntax?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy