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


3383

Nachdem ich auf den neuesten Stall aktualisiert hatte nodeund es npmversuchte npm install moment --save. Es speichert den Eintrag in der package.jsonmit 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?

42
Zu Ihrer Information können Sie Präfixe verhindern oder ein benutzerdefiniertes verwenden, indem Sie : npm config set save-prefix=''. ( ~Halten Sie die Anführungszeichen ein, wenn Sie dies bevorzugen.) Ich persönlich mache das und schrumpfe für Dinge in der Produktion.
Fncomp

19
Alle Details der Funktionsweise von Tilde und Caret sowie Unterschiede: github.com/npm/node-semver#tilde-ranges-123-12-1
Jeffrey Martinez

11
Dieses Tool ist ein großartiger Helfer zum Testen von semver.npmjs.com
chaiyachaiya

@fncomp wollte nur klären, ob ich Ihren Kommentar richtig verstanden habe. Verwenden Sie in Ihrem Projekt nur bestimmte Versionen von Abhängigkeiten? Unser Team zögert, Abhängigkeiten zu aktualisieren. Würden Sie empfehlen, bestimmte Versionen oder das Präfix '~' für die Abhängigkeiten zu verwenden?
Blogs4t

@fncomp Könnten Sie bitte genau beschreiben, was Sie mit "Ich persönlich mache das und schrumpfen für Dinge in der Produktion" meinen. Vielen Dank!
Blogs4t

Antworten:


3842

Siehe die NPM-Dokumente und Semver-Dokumente

~ Version "Ungefähr gleichwertig mit Version" aktualisiert Sie auf alle zukünftigen Patch-Versionen, ohne die Nebenversion zu erhöhen. ~1.2.3verwendet Releases von 1.2.3 bis <1.3.0.

^ Version "Kompatibel mit Version" aktualisiert Sie auf alle zukünftigen Neben- / Patch-Versionen, ohne die Hauptversion zu erhöhen. ^2.3.4verwendet Releases von 2.3.4 bis <3.0.0.

Siehe Kommentare unten.


325
Wenn Sie hier posten, um hoffentlich Leute zu fangen, die dies nicht ganz durchdenken, aber sowohl ^ als auch ~ davon ausgehen, dass Sie Minor- und Point-Releases aus Ihren Abhängigkeiten vertrauen können. Wenn Sie eine Bibliothek veröffentlichen und möchten, dass andere Personen Ihnen vertrauen, akzeptieren Sie DOWNSTREAM-ABHÄNGIGKEITEN NICHT BLIND. Eine schlechte Punktfreigabe aus Ihrer Abhängigkeit kann eine Kettenreaktion stromaufwärts verursachen und dazu führen, dass Menschen an IHRE Tür klopfen, wenn die Dinge birnenförmig werden. Dies ist ein weiterer wichtiger Grund, npm Shrinkwrap für Ihren Produktionscode zu verwenden.
Tehfoo

8
Sie können auch einfach den ganzen Unsinn von npm beseitigen, indem Sie Ihren Versionen ein ^oder ein vorangestellt haben ~. npm config set save-prefix=''
Stellen

5
@prasanthv ist richtig: von docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : 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. Mit anderen Worten, dies ermöglicht Patch- und kleinere Updates für Versionen 1.0.0 und höher, Patch-Updates für Versionen 0.X> = 0.1.0 und keine Updates für Versionen 0.0.X.
Rofrol

15
@jgillich in semver wenn du verwendest 0.2.x, 2ist kein major version. Aus diesem Grund hat docs.npmjs.com die spezifischen Wörter verwendet : the left-most non-zero digit. Und was ist mit diesem Fall: ^ 0.0.4 bedeutet 0.0.4
Rofrol

11
@FagnerBrack: Das von Ihnen angegebene Beispiel ist korrekt, aber im Allgemeinen ist Ihre Denkweise falsch. Ein Beispiel: Angenommen, Sie haben Paket Ain drei Versionen: 0.0.1, 0.0.2und 0.0.3. Es gibt einen Fehler 0.0.1, den Sie zumindest 0.0.2in Ihrem Paket haben möchten B. Wenn Sie schreiben, erhalten 0.0.xSie 0.0.3, was in Ordnung ist. Aber wenn ein anderes Paket Cerfordert sowohl Bund Aund zusätzlich einschränken hat "A": "<0.0.2"werden Sie erhalten , 0.0.1ohne jeden Konflikt Problem darstellt, das ist nicht das, was Sie wollen. Die Verwendung von Tilde ~0.0.2sollte Ihnen helfen, dieses Problem zu vermeiden.
Maciej Sz

862

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"Entspricht ungefähr der Version" Siehe npm semver - Tilde Ranges & semver (7)
  • ^version"Kompatibel mit Version" Siehe npm semver - Caret Ranges & semver (7)
  • version Muss genau mit der Version übereinstimmen
  • >version Muss größer als die Version sein
  • >=version usw
  • <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 sind GitHub-URLs und GitHub-Benutzer-Repos, lokale Pfade und Pakete mit bestimmten npm-Tags


8
Es ist auch möglich, einen genauen Versionsbereich anzugeben, z. 1.2.0 || >=1.2.2 <1.3.0B.: Genau 1.2.0 oder alles von 1.2.2 bis 1.3.0 (einschließlich), jedoch nicht 1.2.1 oder 1.3.1 und höher und auch nicht 1.1 .x und darunter.
CodeManX

Ein spezifischerer Link von oben -> docs.npmjs.com/files/package.json#dependencies
Toby

"Approximately equivalent to version"und "Compatible with version"sind solche frustrierend unspezifischen Wege, um ~ und ^ Verhalten zu beschreiben. Vielen Dank an @jgillich für die tatsächliche Antwort!
Scott Stafford

636

Mit npm können Sie eine neuere Version eines Pakets als die angegebene installieren. Mit tilde ( ~) erhalten Sie Bugfix-Releases und mit caret ( ^) erhalten Sie auch abwärtskompatible neue Funktionen.

Das Problem ist, dass alte Versionen normalerweise nicht so viele Fehlerbehebungen erhalten, daher verwendet npm caret ( ^) als Standard für --save.

Semver-Tabelle

Laut: "Semver erklärte - 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.xx erlaubt das Caret nur Patch- Updates, dh es verhält sich genauso wie die Tilde. Siehe "Caret Ranges"

Hier ist eine visuelle Erklärung der Konzepte:

Semver-Diagramm

Quelle: "Semantic Versioning Cheatsheet" .


2
Was ist mit ^ 0.2.5? von docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : 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. Mit anderen Worten, dies ermöglicht Patch- und kleinere Updates für Versionen 1.0.0 und höher, Patch-Updates für Versionen 0.X> = 0.1.0 und keine Updates für Versionen 0.0.X.
Rofrol

11
@rofrol jede Version vor 1.0.0 gilt als instabil und diese Regeln gelten nicht
pspi

2
Ihre Erklärung ist also nicht vollständig
Rofrol

5
@rofrol Ja, das Auslassen der Lesbarkeit ist manchmal gut. Die Wahrscheinlichkeit, dass für eine Abhängigkeit im Paket json etwas unter 1.0.0 liegt, ist ziemlich gering. siehe auch 20/80 Prinzip, ist eine gute Regel, um sich auf das
Wesentliche

1
@pspi Versionen unter 1.0.0 zu haben ist "unwahrscheinlich"? Von 60 haben wir ~ 15, und die meisten von ihnen sind nicht dunkel.
Dave Newton

99

Semver

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

Änderungen zulassen oder nicht zulassen

  • Pin-Version : 1.2.3.
  • Verwenden Sie ^(wie Kopf). Ermöglicht Aktualisierungen auf der zweiten Ebene ungleich Null von links: ^0.2.3bedeutet 0.2.3 <= v < 0.3.
  • Verwenden Sie ~(wie Schwanz). Im Allgemeinen ganz rechts einfrieren oder Null setzen, wenn nicht angegeben:
    • ~1 meint 1.0.0 <= v < 2.0.0
    • ~1.2bedeutet 1.2.0 <= v < 1.3.0.
    • ~1.2.4bedeutet 1.2.4 <= v < 1.3.0.
  • Ebene ganz rechts weglassen: 0.2bedeutet 0.2 <= v < 1. Unterscheidet sich von ~weil:
    • Das Starten der ausgelassenen Level-Version ist immer 0
    • Sie können die Startversion der Hauptversion festlegen, ohne Unterebenen anzugeben.

Alle (hoffentlich) Möglichkeiten

Stellen Sie den Start der Hauptstufe ein und lassen Sie Aktualisierungen nach oben zu

*  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

Minor-Level einfrieren

^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 das Angeben betaohne Nummer entspricht anydem fehlenden Level.

Hinweis : Wenn Sie ein Paket mit der 0Hauptstufe installieren, wird durch das Update nur die neue Beta / Pr-Version installiert! Das ist , weil npmSätze ^als Standard in package.jsonund wenn installierte Version ist wie 0.1.3, es friert alle Major / Minor / Patch - Level.


Es ist eine schreckliche Lösung, den Leuten zu sagen, dass sie es vermeiden sollen, Projekte ab 0 zu starten, weil Bibliotheks- und konsumierende Entwickler das System nicht verstehen. Ich denke, @asdfasdfads hat viel bessere Informationen.
ProLoser

@ProLoser Ich denke nur, dass das System vereinfacht werden sollte und wir keine 0.x-Versionen verwenden sollten.
Rofrol

1
Der Anwendungsfall um die frühe Lebenszyklusentwicklung und v0 ist sehr sinnvoll. Wenn ich lerne, wie sich v0 richtig verhält, freue ich mich auf andere Projekte im frühen Lebenszyklus. Dies bedeutet, dass Sie eine sich schnell ändernde API mit vielen Abwärtsinkompatibilitäten haben können, ohne gezwungen zu sein, Ihr Projekt als 1.x (auch bekannt als: stabil) zu deklarieren, wenn dies wirklich nicht der Fall ist.
ProLoser

Ich verstehe es, aber ich mag es einfach nicht, wie es mit Semver und Qualifikanten
funktioniert

2
Es fühlt sich eher wie eine Meinung an und sollte nicht als allgemein akzeptierter Ansatz verstanden werden. Und ^ 0.1.x bekommt Patches vollkommen in Ordnung.
ProLoser

93

~behebt Haupt- und Nebenzahlen. Es wird verwendet, wenn Sie bereit sind, Fehlerbehebungen in Ihrer Abhängigkeit zu akzeptieren, aber keine potenziell inkompatiblen Änderungen wünschen.

^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 nicht kompatibel sind.

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

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


13
nicht wahr: 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. Mit anderen Worten, dies ermöglicht Patch- und kleinere Updates für Versionen 1.0.0 und höher, Patch-Updates für Versionen 0.X> = 0.1.0 und keine Updates für Versionen 0.0.X. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
Rofrol

6
Diese Antwort ist völlig falsch (wie viele andere hier). Keiner von diesen hat jemals eine größere Zahl festgelegt! Wie @rofrol sagte, lässt ^ einfach die am weitesten links stehende Ziffer ungleich Null unverändert. ~ erlaubt andererseits nur Patch-Updates, wenn die Nebenversion angegeben ist (z. B. ~ 1.2.3 oder ~ 1.2), und erlaubt kleinere Aktualisierungen, wenn die Nebenversion nicht angegeben ist (z. B. ~ 1).
TheBaj

2
@TheBaj Sie bedeuten "fix" als "define" ("fixate") und nicht als "adjust". Sie sind sich also alle einig, wie mit der Hauptnummer umgegangen wird.
Maaartinus

1
Ja, diese Antwort schien völlig rückständig zu sein, bis mir klar wurde, dass der Antwortende "fix" meinte, wie in "fix, stationär oder unveränderlich".
NattyC

57

~: Ziemlich nah an

   ~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

17
@kytwb - nein. Im Sonderfall der Versionsnummern der nullten Version entspricht das Karat der Tilde. Daher werden ^0.1.3nur Versionen akzeptiert 0.1.xund nicht akzeptiert 0.2.0, obwohl dies ein geringfügiger Schritt ist. Dieses Verhalten entspricht ~0.1.3. Der Grund für dieses Verhalten liegt in der Tatsache, dass Pakete mit nullter Version immer noch als instabil gelten. Mit den Worten von semver.org , Nr. 4, "kann sich jederzeit etwas ändern" (einschließlich rückwärts inkompatibler Änderungen).
Chharvey

31

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

Eine gute Lektüre ist dieser Blog-Beitrag darüber, wie Semver auf npm angewendet wird
und was sie tun, damit es dem Semver-Standard
http://blog.npmjs.org/post/98131109725/npm-2-0-0 entspricht


2
nicht wahr: 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. Mit anderen Worten, dies ermöglicht Patch- und kleinere Updates für Versionen 1.0.0 und höher, Patch-Updates für Versionen 0.X> = 0.1.0 und keine Updates für Versionen 0.0.X. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
Rofrol

28

Hat Anpassung betrachtet werden kann „gebrochen“ , weil es aktualisieren würde nicht ^0.1.2zu 0.2.0. Wenn die Software auf dem Markt ist, verwenden Sie 0.x.yVersionen, und der Hutabgleich stimmt nur mit der letzten variierenden Ziffer überein ( y). Dies geschieht absichtlich. Der Grund dafür ist, dass sich die API während der Weiterentwicklung der Software schnell ändert: Eines Tages haben Sie diese Methoden und am anderen Tag 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, erhöhen Sie die Hauptversion: z. B. 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 eine Version 11.0.0aussehen, und das sieht nicht sehr aussagekräftig aus und sieht tatsächlich verwirrend aus. Wenn Sie andererseits 0.1.x-> verwenden0.2.x-> 0.3.xVersionen Wenn die Software dann zu 100% fertig und mit allen Funktionen ausgestattet ist, wird sie als Version veröffentlicht. 1.0.0Dies bedeutet, dass es sich bei dieser Version um eine Langzeitversion handelt. Sie können fortfahren und diese Version der Bibliothek in Ihrer Produktion verwenden Code, und der Autor wird morgen oder nächsten Monat nicht alles ändern, und er wird das Paket nicht aufgeben ".

Die Regel lautet: Verwenden Sie die 0.x.yVersionierung, wenn Ihre Software noch nicht ausgereift ist, und geben Sie sie frei, indem Sie die mittlere Ziffer erhöhen, wenn sich Ihre öffentliche API ändert (daher werden Benutzer ^0.1.0nicht 0.2.0aktualisiert und der Code wird nicht beschädigt). Wenn die Software ausgereift ist, geben Sie sie frei 1.0.0und erhöhen Sie die Ziffer ganz links bei jeder Änderung Ihrer öffentlichen API (daher werden Benutzer ^1.0.0nicht 2.0.0aktualisiert und der Code wird nicht beschädigt).

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.

Dieser Kommentar war lächerlich hilfreich und scheint nicht sehr gut dokumentiert zu sein. Haben Sie einen Link zur Dokumentation zu diesem Verhalten? Diese Antwort zu v0-Projekten hat mir sehr geholfen.
ProLoser

Ich habe keinen Link: Ich fand diese Informationen auch, indem ich googelte und mit dem npm semantic version calculator semver.npmjs.com
catamphetamine

2
Muss formeller zu ihrer Dokumentation hinzugefügt werden. Ich habe meinem Engineering-Team einen Vortrag bei Sony gehalten, weil er so leicht übersehen zu werden scheint. slide.com/proloser/semver-v0
ProLoser

24

~ Tilde:

  • ~friert Dur- und Moll-Zahlen ein.
  • Es wird verwendet, wenn Sie bereit sind, Fehlerbehebungen in Ihrer Abhängigkeit zu akzeptieren, aber keine potenziell inkompatiblen Änderungen wünschen.
  • Die Tilde entspricht der neuesten Nebenversion (der mittleren Nummer).
  • ~ 1.2.3 wird mit allen 1.2.x-Versionen übereinstimmen, aber es wird 1.3.0 fehlen.
  • Tilde (~) bietet Ihnen Bugfix-Releases

^ Caret:

  • ^ friert nur die Hauptzahl ein.
  • Es wird verwendet, wenn Sie Ihre Abhängigkeiten genau beobachten und bereit sind, Ihren Code schnell zu ändern, wenn kleinere Versionen nicht kompatibel sind.
  • Sie werden auf die neueste Hauptversion (die erste Nummer) aktualisiert .
  • ^ 1.2.3 stimmt mit jeder 1.xx-Version einschließlich 1.3.0 überein, hält sich jedoch auf 2.0.0 zurück.
  • Caret (^) bietet Ihnen auch abwärtskompatible neue Funktionen.

1
Die Tilde entspricht der neuesten Patch-Version (der letzten Nummer). Das Caret entspricht der neuesten Nebenversion (der mittleren Nummer).
Abdul Rauf

"Einfrieren" ist die beste Erklärung.
Mhrabiee

Caret friert beide die Hauptnummer ein und aktualisiert Sie auf die neueste Hauptversion (die erste Nummer)? Die Hauptzahl ist die erste Zahl, daher macht dies keinen Sinn.
NattyC

19

Tilde ~ entspricht der Nebenversion. Wenn Sie ein Paket mit 1.4.2 installiert haben und nach der Installation auch die Versionen 1.4.3 und 1.4.4 verfügbar sind, wenn es in Ihrer package.json als ~ 1.4.2 und dann als npm-Installation verwendet wird In Ihrem Projekt wird nach dem Upgrade 1.4.4 in Ihrem Projekt installiert. Für dieses Paket ist jedoch 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 nach der Installation von 1.5.0 die Hauptversion installiert wird, installiert ^ die Hauptversion. Es ist nicht möglich, 2.1.0 zu installieren, wenn Sie ^ 1.4.2 haben .

Feste Version Wenn Sie die Version des Pakets nicht bei jeder Installation ändern möchten, verwenden Sie eine 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.


3
Diese Antwort ist irreführend. SemVer gibt eindeutig an, dass eine normale Versionsnummer die Form XYZ [wobei] X die Hauptversion, Y die Nebenversion und Z die Patchversion sein muss.
Leo

15

Eine Liner Erklä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 fest, Nebenversion ist fest, stimmt mit jeder Build-Nummer überein

Beispiel: ~ 2.4.1 bedeutet, dass nach 2.4.x gesucht wird, wobei x etwas ist

^ : Hauptversion ist fest, stimmt mit jeder Nebenversion überein, stimmt mit jeder Build-Nummer überein

Beispiel: ^ 2.4.1 bedeutet, dass nach 2.xx gesucht wird, wobei x etwas ist


5
Ich sehe 7 Zeilen in dieser Antwort
FluxLemur

11

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

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

Die Tilde (~)

Im einfachsten Sinne entspricht die Tilde (~) der neuesten Nebenversion (der mittleren Zahl). ~ 1.2.3 entspricht allen 1.2.x-Versionen, es fehlt jedoch 1.3.0.

Das Caret (^)

Das Caret (^) ist dagegen entspannter. Sie werden auf die neueste Hauptversion (die erste Nummer) aktualisiert. ^ 1.2.3 stimmt mit jeder 1.xx-Version einschließlich 1.3.0 überein, hält sich jedoch auf 2.0.0 zurück.

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


Auch diese Antwort ist irreführend. SemVer gibt eindeutig an, dass eine normale Versionsnummer die Form XYZ [wobei] X die Hauptversion, Y die Nebenversion und Z die Patchversion sein muss.
Leo

5

semver ist in 3 Hauptabschnitte unterteilt, die durch Punkte unterbrochen sind.

major.minor.patch
1.0.0

Diese verschiedenen Haupt-, Neben- und Patch-Versionen identifizieren unterschiedliche Versionen. tide (~) und caret (^) identifizieren, welche Minor- und Patch-Version für die Paketversionierung verwendet werden soll.

~1.0.1
 Install 1.0.1 or **latest patch versions** such as 1.0.2 ,1.0.5
^1.0.1
 Install 1.0.1 or **latest patch and minor versions** such as 1.0.2 ,1.1.0 ,1.1.1

4

Tilde (~)

Die Hauptversion ist fest, die Nebenversion ist fest und entspricht einer beliebigen Build-Nummer

"express": "~4.13.3" 

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

Caret (^)

Die Hauptversion ist fest, stimmt mit jeder Nebenversion überein und stimmt mit jeder Build-Nummer überein

"supertest": "^3.0.0"

^3.0.0 bedeutet, dass nach 3.xx gesucht wird, wobei x etwas ist


Können Sie näher erläutern, wie sich diese Antwort von der vor 4 Jahren veröffentlichten Antwort unterscheidet? ?
Franklin Yu

2

Die Versionsnummer ist in Syntax angegeben, die jeden Abschnitt mit unterschiedlicher Bedeutung bezeichnet. Die Syntax ist in drei durch einen Punkt getrennte Abschnitte unterteilt.

major.minor.patch 1.0.2

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

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

Wenn Sie also ~ 1.0.2 sehen, bedeutet dies, dass Sie Version 1.0.2 oder die neueste Patch-Version wie 1.0.4 installieren. Wenn Sie ^ 1.0.2 sehen, bedeutet dies, dass Sie Version 1.0.2 oder die neueste Neben- oder Patch-Version wie 1.1.0 installieren.


1
Können Sie näher erläutern, inwiefern sich diese Antwort von der vor 4 Jahren veröffentlichten Antwort unterscheidet ?
Franklin Yu

2

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

Tilde ~ enthält alles, was größer als eine bestimmte Version ist, im selben kleinen 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
  • Kleinere Releases: 1 oder 1.x oder ^ 1.0.4
  • Hauptversionen: * oder x

Weitere Informationen zur Syntax der semantischen Versionierung finden Sie im npm semver-Rechner .

npm semantische Versionen in veröffentlichten Paketen§

Mehr aus der npm-Dokumentation Informationen zur semantischen Versionierung


1

Keine Antwort an sich, 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

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

Mittel, die ^10.2.3übereinstimmen10.2.3 <= v < 20.0.0

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

Ich denke, sie meinten left most non-zero number field. In SemVer gibt es nichts, was erfordert, dass Zahlenfelder einstellig sind.


0

~ spezifiziert für kleinere Versionsversionen ^ spezifiziert für größere Versionsversionen

Wenn die Paketversion beispielsweise 4.5.2 ist, wird bei Update ~ 4.5.2 die neueste Version 4.5.x (MINOR VERSION) installiert. ^ 4.5.2 installiert die neueste Version 4.xx (MAJOR VERSION).


8
Können Sie näher erläutern, inwiefern sich diese Antwort von der vor 4 Jahren veröffentlichten Antwort unterscheidet ?
Franklin Yu

0

Im Zusammenhang mit dieser Frage können Sie die Composer-Dokumentation zu Versionen lesen , aber hier kurz:

  • Tilde-Versionsbereich ( ~ ) - ~ 1.2.3 entspricht> = 1.2.3 < 1.3.0
  • Caret-Versionsbereich ( ^ ) - ~ 1.2.3 entspricht> = 1.2.3 < 2.0.0

Mit Tilde erhalten Sie automatische Updates von Patches, kleinere und größere Versionen werden jedoch nicht aktualisiert. Wenn Sie Caret verwenden, erhalten Sie Patches und Nebenversionen, jedoch keine Hauptversionen (Änderungen).

Die Tilde-Version gilt als "sicherer" Ansatz. Wenn Sie jedoch zuverlässige Abhängigkeiten (gut gepflegte Bibliotheken) verwenden, sollten Sie keine Probleme mit der Caret-Version haben (da geringfügige Änderungen keine Änderungen bewirken sollten.

Sie sollten diesen Stackoverflow-Beitrag wahrscheinlich über Unterschiede zwischen der Composer-Installation und dem Composer-Update lesen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.