it-swarm.com.de

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

Nachdem ich auf die neuesten Stables node und npm aktualisiert habe, habe ich npm install moment --save ausprobiert. Der Eintrag im package.json wird mit dem Präfix ^ gespeichert. Zuvor war es ein Tilde ~-Präfix.

  1. Warum werden diese Änderungen in npm vorgenommen?
  2. Was ist der Unterschied zwischen Tilde ~ und Caret ^?
  3. Was sind die Vorteile gegenüber anderen?
2992
Fizer Khan

Die Tilde ~ stimmt mit der neuesten Patch-Version (der dritten Nummer) für die angegebene Nebenversion (der zweiten Nummer) überein.
~ 1.2.3 passt zu allen 1.2.x-Versionen, bleibt jedoch bei 1.3.0 stehen.

Das Caret ^ ist entspannter. Es stimmt mit der neuesten Nebenversion (der zweiten Nummer) für die angegebene Hauptversion (der ersten Nummer) überein.
^ 1.2.3 passt zu jeder 1.x.x-Version einschließlich 1.3.0, bleibt jedoch bei 2.0.0 stehen.

(Dies ist eine modifizierte und korrigierte Version von http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/ )

3466
jgillich

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

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

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

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

Die obige Liste ist nicht vollständig. Andere Versionsspezifizierer umfassen GitHub-URLs und GitHub-Benutzerrepos, lokale Pfade und Pakete mit bestimmten npm-Tags

764
Ahmad

Mit Npm kann eine neuere Version eines Pakets als die angegebene installiert werden. Die Verwendung von tilde (~) gibt Ihnen Fehlerbehebungsversionen und caret (^) gibt Ihnen auch abwärtskompatible neue Funktionen.

Das Problem ist, dass alte Versionen in der Regel nicht so häufig Fehlerbehebungen erhalten. Daher verwendet npm caret (^) als Standard für --save.

semver table

Laut: "Semver erklärt - warum gibt es ein Caret (^) in meinem package.json?" .

Beachten Sie , dass die Regeln für Versionen über 1.0.0 gelten und nicht jedes Projekt der semantischen Versionierung folgt. Für die Versionen 0.x.x erlaubt das Caret nur Patch -Updates, d. H. Es verhält sich wie die Tilde. Siehe "Caret Ranges"

Hier ist eine visuelle Erklärung der Konzepte:

semver diagram

Quelle: "Semantic Versioning Cheatsheet" .

490
pspi

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Verwenden Sie zum Testen npm semver calculator . (Obwohl die Erklärungen für ^ (alles, was größer als eine bestimmte Version im selben Hauptbereich ist) und ~ (alles, was größer als eine bestimmte Version im selben Nebenbereich ist) nicht zu 100% korrekt sind, scheint der Rechner einwandfrei zu funktionieren )
  • Alternativ können Sie auch SemVer Check verwenden, wodurch Sie kein Paket auswählen müssen und auch Erklärungen anbieten.

Änderungen zulassen oder nicht zulassen

  • PIN-Version: 1.2.3.
  • Verwenden Sie ^ (wie head). Ermöglicht Aktualisierungen auf der zweiten Nicht-Null-Ebene von links: ^0.2.3 bedeutet 0.2.3 <= v < 0.3.
  • Benutze ~ (wie tail). In der Regel ganz rechts einfrieren oder Null setzen, wenn weggelassen:
    • ~1 bedeutet 1.0.0 <= v < 2.0.0
    • ~1.2 bedeutet 1.2.0 <= v < 1.3.0.
    • ~1.2.4 bedeutet 1.2.4 <= v < 1.3.0.
  • Ommit am weitesten rechts stehende Ebene: 0.2 bedeutet 0.2 <= v < 1. Unterscheidet sich von ~ durch:
    • Die ausgelassene Level-Version wird immer mit 0 gestartet.
    • Sie können die Start-Hauptversion ohne Angabe von Unterebenen festlegen.

Alle (hoffentlich) Möglichkeiten

Start-Hauptstufe festlegen und Updates nach oben zulassen

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

Major-Level einfrieren

~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 minor-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

Patch-Level einfrieren

~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

Hinweis : Das Fehlen von Dur, Moll, Patch oder die Angabe von beta ohne Nummer entspricht any für den fehlenden Level.

Hinweis : Wenn Sie ein Paket installieren, dessen Hauptversion 0 ist, installiert das Update nur eine neue Beta/Pr-Version! Das liegt daran, dass npm^ als Standard in package.json festlegt und bei einer installierten Version wie 0.1.3 alle Haupt-/Neben-/Patch-Ebenen einfriert.

89
rofrol

~ behebt Haupt- und Nebennummern. Es wird verwendet, wenn Sie bereit sind, Fehlerbehebungen 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 Releases nicht kompatibel sind.

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

Also ist ^ ein guter Standardwert, aber er ist nicht perfekt. Ich schlage vor, den Semver-Operator, der für Sie am nützlichsten ist, sorgfältig auszuwählen und zu konfigurieren.

84
alex

~: Ziemlich nah 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
52
haotang

^ ist 1. [any]. [Any] (neueste Nebenversion)
~ ist 1.2. [Any] (neuester Patch)

Eine gute Lektüre ist dieser Blog-Beitrag darüber, wie Semver auf npm zutrifft
und was sie tun, um es zusammenzubringen der Semver-Standard
http://blog.npmjs.org/post/98131109725/npm-2-0-

28
Will Stern

Die Hutübereinstimmung kann als "defekt" angesehen werden, da ^0.1.2 nicht auf 0.2.0 aktualisiert wird. Wenn die Software auftaucht, verwenden Sie 0.x.y Versionen und die Hutübereinstimmung stimmt nur mit der letzten variierenden Ziffer überein (y). Dies geschieht absichtlich. Der Grund ist, dass sich die API während der Entwicklung der Software schnell ändert: Eines Tages haben Sie diese Methoden, und am anderen Tag haben Sie diese Methoden, und die alten sind verschwunden. Wenn Sie den Code für Benutzer, die Ihre Bibliothek bereits verwenden, nicht unterbrechen möchten, erhöhen Sie die Hauptversion: z. 1.0.0 -> 2.0.0 -> 3.0.0. Wenn Ihre Software also zu 100% fertig und mit allen Funktionen ausgestattet ist, wird sie wie die Version 11.0.0 aussehen, und das sieht nicht sehr aussagekräftig aus und sieht tatsächlich verwirrend aus. Wenn Sie andererseits 0.1.x -> 0.2.x -> 0.3.x -Versionen verwendet haben, wird die Software zu dem Zeitpunkt, zu dem sie zu 100% fertig ist und über alle Funktionen verfügt, als Version veröffentlicht 1.0.0 und es bedeutet "Diese Version ist eine Langzeit-Service-Version. Sie können fortfahren und diese Version der Bibliothek in Ihrem Produktionscode verwenden, und der Autor wird morgen oder im nächsten Monat nicht alles ändern, und er wird das Paket nicht aufgeben ".

Die Regel lautet: Verwenden Sie die Versionierung von 0.x.y, wenn Ihre Software noch nicht ausgereift ist, und geben Sie sie mit einer Erhöhung der mittleren Ziffer frei, wenn sich Ihre öffentliche API ändert (daher erhalten Benutzer mit ^0.1.0 nicht 0.2.0 aktualisieren und es wird ihren Code nicht brechen). Wenn die Software dann ausgereift ist, geben Sie sie unter 1.0.0 frei und erhöhen Sie die linke Ziffer bei jeder Änderung Ihrer öffentlichen API (daher erhalten Benutzer mit ^1.0.0 keine Aktualisierung von 2.0.0 und dies nicht brechen ihren Code).

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.
27
asdfasdfads

Einzeilererklärung

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

npm überprüft und korrigiert die Version eines bestimmten Pakets anhand dieser Zeichen

~: Hauptversion ist behoben, Nebenversion ist behoben, passt zu jeder Build-Nummer

z. : ~ 2.4.1 bedeutet, dass nach 2.4.x gesucht wird, wo x irgendetwas ist

^: Hauptversion ist behoben, passt zu jeder Nebenversion, passt zu jeder Build-Nummer

z. : ^ 2.4.1 bedeutet, es wird nach 2.x.x gesucht, wo x irgendetwas ist

14
Avinash

Tilde ~ entspricht der Nebenversion, wenn Sie ein Paket mit 1.4.2 installiert haben und nach Ihrer Installation die Versionen 1.4.3 und 1.4.4 ebenfalls verfügbar sind, wenn es in Ihrer package.json als verwendet wird ~ 1.4.2 und dann npm in Ihrem Projekt installieren nach dem Upgrade wird 1.4.4 in Ihrem Projekt installiert. Aber für dieses Paket ist 1.5.0 verfügbar, dann wird es von ~ nicht installiert. Es heißt Nebenversion.

Caret ^ entspricht der Hauptversion. Wenn das 1.4.2-Paket in Ihrem Projekt installiert ist und auch 1.5.0 verfügbar ist, installiert ^ die Hauptversion. Die Installation von 2.1.0 ist nicht möglich, wenn Sie ^ 1.4.2 haben.

Feste Version Wenn Sie die Version des Pakets nicht bei jeder Installation ändern möchten, verwenden Sie die feste Version ohne Sonderzeichen, z. B. "1.4.2"

Neueste Version * Wenn Sie die neueste Version installieren möchten, verwenden Sie * nur vor dem Paketnamen.

11
Mudassir

Sie haben wahrscheinlich die Tilde (~) und das Caret (^) in package.json gesehen. Was ist der Unterschied zwischen ihnen?

Wenn Sie npm install moment --save ausführen, wird der Eintrag in package.json mit dem Präfix caret (^) gespeichert.

Die Tilde (~)

Im einfachsten Fall entspricht die Tilde (~) der neuesten Nebenversion (der mittleren Zahl). ~ 1.2.3 wird mit allen 1.2.x-Versionen übereinstimmen, aber 1.3.0 verfehlen.

Das Caret (^)

Das Caret (^) hingegen ist entspannter. Sie werden auf die neueste Hauptversion (die erste Nummer) aktualisiert. ^ 1.2.3 passt zu jeder 1.x.x-Version, einschließlich 1.3.0, bleibt jedoch bei 2.0.0 stehen.

Referenz: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b

11
Abdou Sameh

~ Tilde:

  • ~ friert ein Haupt- und Nebennummern.
  • Es wird verwendet, wenn Sie bereit sind, Fehlerbehebungen in Ihrer Abhängigkeit zu akzeptieren, aber keine potenziell inkompatiblen Änderungen möchten.
  • Die Tilde entspricht der aktuellste Nebenversion (mittlere Zahl).
  • ~ 1.2.3 wird mit allen 1.2.x-Versionen übereinstimmen, aber es wird 1.3.0 fehlen.
  • Tilde (~) gibt Ihnen Fehlerbehebungsversionen

^ Caret:

  • ^ friert nur die Hauptnummer ein.
  • Es wird verwendet, wenn Sie Ihre Abhängigkeiten genau beobachten und bereit sind, Ihren Code schnell zu ändern, wenn kleinere Releases nicht kompatibel sind.
  • Es aktualisiert Sie auf die neueste Hauptversion (die erste Nummer).
  • ^ 1.2.3 passt zu jeder 1.x.x-Version, einschließlich 1.3.0, bleibt jedoch bei 2.0.0 erhalten.
  • Mit Caret (^) erhalten Sie auch abwärtskompatible neue Funktionen.
9
Laxmi

Tilde (~)

die Hauptversion ist repariert, die Nebenversion ist repariert und passt zu jeder Build-Nummer

"express": "~4.13.3" 

~4.13.3 bedeutet, dass nach 4.13.x gesucht wird, wobei x irgendetwas ist und 4.14.0

Caret (^)

die Hauptversion ist fest, passt zu jeder Nebenversion, passt zu jeder Build-Nummer

"supertest": "^3.0.0"

^3.0.0 bedeutet, dass nach 3.x.x gesucht wird, wobei x für etwas steht

5
Farhan Yaseen

Die Versionsnummer hat eine Syntax, die jeden Abschnitt mit einer anderen Bedeutung kennzeichnet. Die Syntax ist in drei Abschnitte unterteilt, die durch einen Punkt getrennt sind.

major.minor.patch 1.0.2

Major, Moll und Patch repräsentieren die verschiedenen Versionen eines Pakets.

npm verwendet die Tilde (~) und das Caret (^), um anzugeben, welche Patch- und Nebenversionen verwendet werden sollen.

Wenn Sie also ~ 1.0.2 sehen, müssen Sie Version 1.0.2 oder die neueste Patch-Version wie 1.0.4 installieren. Wenn ^ 1.0.2 angezeigt wird, müssen Sie Version 1.0.2 oder die neueste Neben- oder Patch-Version wie 1.1.0 installieren.

3

Karat ^ enthält alles, was größer ist als eine bestimmte Version im selben Hauptbereich.

tilde ~ enthält alles, was größer ist als eine bestimmte Version im selben untergeordneten Bereich.

Verwenden Sie beispielsweise die folgende Syntax, um akzeptable Versionsbereiche bis 1.0.4 anzugeben:

  • Patch-Versionen: 1.0 oder 1.0.x oder ~ 1.0.4
  • Nebenversionen: 1 oder 1.x oder ^ 1.0.4
  • Hauptversionen: * oder x

Weitere Informationen zur Syntax der semantischen Versionierung finden Sie in npm semver calculator .

npm semantic versions in published packages§

Weitere Informationen finden Sie in der Dokumentation zu npm Informationen zur semantischen Versionierung

2
ElasticCode

An sich keine Antwort, sondern eine Beobachtung, die übersehen worden zu sein scheint.

Die Beschreibung für Karatbereiche:

siehe: https://github.com/npm/node-semver#caret-ranges-123-025-004

Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] Tuple.

Bedeutet, dass ^10.2.3 mit 10.2.3 <= v < 20.0.0 übereinstimmt

Ich glaube nicht, dass sie das meinten. Wenn Sie die Versionen 11.x.x bis 19.x.x einspielen, wird Ihr Code beschädigt.

Ich denke sie meinten left most non-zero number field. Es gibt nichts in SemVer, bei dem Zahlenfelder einstellig sein müssen.

1
Jesse Chisholm

~ Angaben zu Nebenversionen ^ Angaben zu Hauptversionen

Wenn zum Beispiel die Paketversion 4.5.2 ist, installiert Update ~ 4.5.2 die neueste Version 4.5.x (MINOR VERSION) ^ 4.5.2 installiert die neueste Version 4.x.x (MAJOR VERSION)

1
user2849063