Frage Was ist der Unterschied zwischen Tilde (~) und Caret (^) in package.json?


Nach dem Upgrade auf den letzten stabilen node und npm, Ich habe es versucht npm install moment --save. Es speichert den Eintrag in der package.json mit dem caret(^) Präfix. Zuvor war es ein tilde(~) Präfix.

  1. Warum werden diese Änderungen vorgenommen? npm?
  2. Was ist der Unterschied zwischen tilde(~) und caret(^)?
  3. Was sind die Vorteile gegenüber anderen?

2242
2018-03-12 06:02


Ursprung


Antworten:


Im einfachsten Fall entspricht die Tilde der letzten Nebenversion   (die mittlere Zahl). ~ 1.2.3 wird allen 1.2.x-Versionen entsprechen, wird aber   vermisse 1.3.0.

Der Caret hingegen ist entspannter. Es wird dich aktualisieren   die letzte Hauptversion (die erste Nummer). ^ 1.2.3 wird übereinstimmen   jede 1.x.x-Version einschließlich 1.3.0, aber wird auf 2.0.0 halten.

http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/


2626
2018-03-12 08:28



Ich möchte auch die offizielle npmjs-Dokumentation hinzufügen, die alle Methoden für die Versionsspezifität einschließlich der in der Frage genannten beschreibt -

https://docs.npmjs.com/files/package.json

https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-

  • ~version "Etwa gleichwertig mit der Version" Siehe npm sverver - Tilde Ranges & semver (7)
  • ^version "Kompatibel mit der Version" Siehe npm sver - Caret Ranges & semver (7)
  • version Muss genau der Version entsprechen
  • >version Muss größer sein als Version
  • >=version etc
  • <version
  • <=version
  • 1.2.x 1.2.0, 1.2.1 usw., aber nicht 1.3.0
  • http://sometarballurl (Dies kann die URL eines Tarballs sein, der lokal heruntergeladen und installiert wird
  • * Entspricht jeder Version
  • latest Erhält die neueste Version

Die obige Liste ist nicht erschöpfend. Andere Versionsangaben umfassen GitHub URLs und GitHub Benutzer Repos, lokale Pfade und Pakete mit spezifischen npm Tags


568
2017-09-16 06:25



Npm ermöglicht die Installation einer neueren Version eines Pakets als die angegebene. Tilde verwenden (~) gibt Ihnen Bug-Fix Releases und Caret (^) gibt Ihnen auch rückwärtskompatible neue Funktionen.

Das Problem ist, dass alte Versionen normalerweise keine Bugfixes erhalten, so dass npm Caret verwendet (^) als Standard für --save.

semver table

Gemäß: "Semver hat erklärt - warum gibt es einen Caret (^) in meinem Paket.json?".

Hinweis dass die Regeln für Versionen über 1.0.0 gelten und nicht jedes Projekt einer semantischen Versionierung folgt. Für Versionen 0.x.x erlaubt das Caret nur patch Aktualisierungen, d. h. es verhält sich genauso wie die Tilde. Sehen "Caret-Bereiche"

Hier ist eine visuelle Erklärung der Konzepte:

semver diagram

Quelle: "Semantic Versioning Cheatsheet".


346
2017-07-30 20:40



~ behebt große und kleine Zahlen. Es wird verwendet, wenn Sie bereit sind, Bug-Fixes in Ihrer Abhängigkeit zu akzeptieren, aber keine potenziell inkompatiblen Änderungen möchten.

^ behebt nur die Hauptnummer. Es wird verwendet, wenn Sie Ihre Abhängigkeiten genau beobachten und bereit sind, Ihren Code schnell zu ändern, wenn kleinere Versionen inkompatibel sind.

Darüber hinaus, ^ ist nicht unterstützt von alten npm-Versionen und sollte mit Vorsicht verwendet werden.

Damit, ^ ist ein guter Standard, aber es ist nicht perfekt. Ich schlage vor, den für Sie nützlichsten semver-Operator sorgfältig auszuwählen und zu konfigurieren.


74
2018-03-12 23:05



Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Benutzen npm sverver Rechner zum Prüfen. (Obwohl die Erklärungen für ^ (enthalten alles größer als eine bestimmte Version im selben Hauptbereich) und ~ (alles größer als eine bestimmte Version im gleichen Nebenbereich) sind nicht 100% korrekt, scheint der Rechner gut zu funktionieren )
  • Alternativ, verwenden Sie SemVer-Check Stattdessen müssen Sie kein Paket auswählen und bieten auch Erklärungen an.

Zulassen oder verbieten Sie Änderungen

  • Pin-Version: 1.2.3.
  • Benutzen ^ (wie Kopf). Ermöglicht Updates auf der zweiten Nicht-Null-Ebene von links: ^0.2.3 meint 0.2.3 <= v < 0.3.
  • Benutzen ~ (wie Schwanz). Im Allgemeinen ganz rechts einfrieren oder Null setzen, wenn sie weggelassen wird:
    • ~1 meint 1.0.0 <= v < 2.0.0
    • ~1.2 meint 1.2.0 <= v < 1.3.0.
    • ~1.2.4 meint 1.2.4 <= v < 1.3.0.
  • Überspringe die rechte Ebene: 0.2 meint 0.2 <= v < 1. Unterscheidet sich von ~ weil:
    • Starting ausgelassene Level-Version ist immer 0
    • Sie können die Hauptversion starten, ohne Unterebenen anzugeben.

Alle (hoffentlich) Möglichkeiten

Startet die Hauptebene und erlaubt Updates nach oben

*  or "" (empty string)   any version
1                         v >= 1

Freeze-Level

~0 (0)            0.0 <= v < 1
0.2               0.2 <= v < 1          // Can't do that with ^ or ~ 
~1 (1, ^1)        1 <= v < 2
^1.2              1.2 <= v < 2
^1.2.3            1.2.3 <= v < 2
^1.2.3-beta.4     1.2.3-beta.4 <= v < 2

Freeze-Level

^0.0 (0.0)        0 <= v < 0.1
~0.2              0.2 <= v < 0.3
~1.2              1.2 <= v < 1.3
~0.2.3 (^0.2.3)   0.2.3 <= v < 0.3
~1.2.3            1.2.3 <= v < 1.3

Freeze-Patch-Ebene

~1.2.3-beta.4     1.2.3-beta.4 <= v < 1.2.4 (only beta or pr allowed)
^0.0.3-beta       0.0.3-beta.0 <= v < 0.0.4 or 0.0.3-pr.0 <= v < 0.0.4 (only beta or pr allowed)
^0.0.3-beta.4     0.0.3-beta.4 <= v < 0.0.4 or 0.0.3-pr.4 <= v < 0.0.4 (only beta or pr allowed)

Updates nicht zulassen

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Beachten: Missing Major, Minor, Patch oder Angabe beta ohne Nummer, ist das selbe wie any für das fehlende Level.

Beachten: Wenn Sie ein Paket installieren, das hat 0 Als Major Level installiert Update nur neue Beta / PR Level Version! Das ist, weil npm Sätze ^ als Standard in package.json und wenn die installierte Version ist wie 0.1.3Es friert alle Haupt- / Neben- / Patch-Level ein.


66
2017-10-11 16:52



~ : Vernünftig schließen zu

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^: kompatibel mit

   ^1.1.5: 1.1.5 <= accepted < 2.0.0

   ^0.1.3: 0.1.3 <= accepted < 0.2.0

   ^0.0.4: 0.0.4 <= accepted < 0.1.0

42
2018-06-27 16:12



Hat Matching kann als "kaputt" betrachtet werden, da es nicht aktualisiert wird ^0.1.2 zu 0.2.0. Wenn die Software auf dem Markt ist, verwenden Sie sie 0.x.y Versionen und Hutabgleich passen nur zur letzten variierenden Ziffer (y). Dies geschieht absichtlich. Der Grund dafür ist, dass sich die API während der Entwicklung der Software schnell ändert: Eines Tages haben Sie diese Methoden und neulich haben Sie diese Methoden und die alten sind weg. Wenn Sie den Code für Personen, die Ihre Bibliothek bereits verwenden, nicht brechen möchten, gehen Sie und erhöhen Sie die Hauptversion: z. 1.0.0 -> 2.0.0 -> 3.0.0. Wenn Ihre Software also zu 100% fertig und voll ausgestattet ist, wird es wie eine Version sein 11.0.0 und das sieht nicht sehr sinnvoll aus und sieht tatsächlich verwirrend aus. Wenn du andererseits verwendest 0.1.x -> 0.2.x -> 0.3.x Versionen, bis die Software schließlich zu 100% fertig und voll funktionsfähig ist, wird sie als Version veröffentlicht 1.0.0 und es bedeutet "Diese Version ist eine langfristige Dienstleistung, Sie können fortfahren und diese Version der Bibliothek in Ihrem Produktionscode verwenden, und der Autor wird nicht alles morgen oder nächsten Monat ändern, und er wird das nicht aufgeben Paket".

Die Regel lautet: Verwenden 0.x.y Versionierung, wenn Ihre Software noch nicht ausgereift ist, und Freigabe mit Erhöhung der mittleren Ziffer, wenn sich Ihre öffentliche API ändert (also Leute mit ^0.1.0 werde nicht bekommen 0.2.0 Update und es wird nicht ihren Code brechen). Wenn die Software dann reift, lassen Sie sie unter 1.0.0 und bei jedem Wechsel der öffentlichen API die Zahl ganz links hochzählen (also Leute mit ^1.0.0 werde nicht bekommen 2.0.0 Update und es wird nicht ihren Code brechen).

Given a version number MAJOR.MINOR.PATCH, increment the:

MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards-compatible manner, and
PATCH version when you make backwards-compatible bug fixes.

21
2017-10-19 11:24



^ ist 1. [any]. [any] (letzte Nebenversion)
~ ist 1.2. [any] (letzter Patch)

Eine tolle Lektüre ist dieser Blogbeitrag wie sverver für npm gilt
und was sie tun, um es zusammenzubringen der Standard
http://blog.npmjs.org/post/98131109725/npm-2-0-0


20
2017-12-15 18:07



Eine Liner-Erklärung

Das Standardversionssystem ist major.minor.build (z. B. 2.4.1)

npm überprüft und repariert die Version eines bestimmten Pakets basierend auf diesen Zeichen

~ : Hauptversion ist behoben, Nebenversion ist behoben, entspricht jeder Build-Nummer

z.B. : ~ 2.4.1 bedeutet, dass es nach 2.4.x sucht, wo x irgendetwas ist

^ : Hauptversion ist behoben, entspricht jeder Nebenversion, entspricht jeder Build-Nummer

z.B. : ^ 2.4.1 bedeutet, dass es nach 2.x.x sucht, wobei x nichts ist


8
2018-01-21 08:00



~ Tilde:

  • ~ behebt Haupt- und Nebennummern.
  • Es wird verwendet, wenn Sie bereit sind, Bug-Fixes in Ihrer Abhängigkeit zu akzeptieren, aber keine potenziell inkompatiblen Änderungen wünschen.
  • Die Tilde entspricht der jüngste Nebenversion (die mittlere Zahl).
  • ~ 1.2.3 stimmt mit allen 1.2.x Versionen überein, aber es wird 1.3.0 vermissen.
  • Tilde (~) gibt Ihnen Bug-Fix-Versionen

^ Karriere:

  • ^ behebt nur die Hauptnummer.
  • Es wird verwendet, wenn Sie Ihre Abhängigkeiten genau beobachten und bereit sind, Ihren Code schnell zu ändern, wenn kleinere Versionen inkompatibel sind.
  • Es wird dich auf den neuesten Stand bringen neueste Hauptversion (die erste Nummer).
  • ^ 1.2.3 passt zu jedem 1.x.x-Release einschließlich 1.3.0, aber es wird auf 2.0.0 halten.
  • Caret (^) gibt Ihnen auch rückwärtskompatible neue Funktionen.

3
2017-09-30 10:56