Nachdem ich auf den neuesten Stall aktualisiert hatte node
und es npm
versuchte npm install moment --save
. Es speichert den Eintrag in der package.json
mit dem Caret- ^
Präfix. Zuvor war es ein Tilde- ~
Präfix.
- Warum werden diese Änderungen vorgenommen
npm
? - Was ist der Unterschied zwischen Tilde
~
und Caret^
? - Was sind die Vorteile gegenüber anderen?
node.js
npm
package.json
semantic-versioning
Fizer Khan
quelle
quelle
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.Antworten:
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.3
verwendet 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.4
verwendet Releases von 2.3.4 bis <3.0.0.Siehe Kommentare unten.
quelle
^
oder ein vorangestellt haben~
.npm config set save-prefix=''
0.2.x
,2
ist keinmajor 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.4A
in drei Versionen:0.0.1
,0.0.2
und0.0.3
. Es gibt einen Fehler0.0.1
, den Sie zumindest0.0.2
in Ihrem Paket haben möchtenB
. Wenn Sie schreiben, erhalten0.0.x
Sie0.0.3
, was in Ordnung ist. Aber wenn ein anderes PaketC
erfordert sowohlB
undA
und zusätzlich einschränken hat"A": "<0.0.2"
werden Sie erhalten ,0.0.1
ohne jeden Konflikt Problem darstellt, das ist nicht das, was Sie wollen. Die Verwendung von Tilde~0.0.2
sollte Ihnen helfen, dieses Problem zu vermeiden.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.0http://sometarballurl
(Dies kann die URL eines Tarballs sein, der lokal heruntergeladen und installiert wird*
Passt zu jeder Versionlatest
Erhält die neueste VersionDie obige Liste ist nicht vollständig. Andere Versionsspezifizierer sind GitHub-URLs und GitHub-Benutzer-Repos, lokale Pfade und Pakete mit bestimmten npm-Tags
quelle
1.2.0 || >=1.2.2 <1.3.0
B.: 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."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!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
.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:
Quelle: "Semantic Versioning Cheatsheet" .
quelle
Semver
Änderungen zulassen oder nicht zulassen
1.2.3
.^
(wie Kopf). Ermöglicht Aktualisierungen auf der zweiten Ebene ungleich Null von links:^0.2.3
bedeutet0.2.3 <= v < 0.3
.~
(wie Schwanz). Im Allgemeinen ganz rechts einfrieren oder Null setzen, wenn nicht angegeben:~1
meint1.0.0 <= v < 2.0.0
~1.2
bedeutet1.2.0 <= v < 1.3.0
.~1.2.4
bedeutet1.2.4 <= v < 1.3.0
.0.2
bedeutet0.2 <= v < 1
. Unterscheidet sich von~
weil:0
Alle (hoffentlich) Möglichkeiten
Stellen Sie den Start der Hauptstufe ein und lassen Sie Aktualisierungen nach oben zu
Major-Level einfrieren
Minor-Level einfrieren
Patch-Level einfrieren
Updates nicht zulassen
Hinweis : Das Fehlen von Dur, Moll, Patch oder das Angeben
beta
ohne Nummer entsprichtany
dem fehlenden Level.Hinweis : Wenn Sie ein Paket mit der
0
Hauptstufe installieren, wird durch das Update nur die neue Beta / Pr-Version installiert! Das ist , weilnpm
Sätze^
als Standard inpackage.json
und wenn installierte Version ist wie0.1.3
, es friert alle Major / Minor / Patch - Level.quelle
~
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.quelle
~
: Ziemlich nah an^
: Kompatibel mitquelle
^0.1.3
nur Versionen akzeptiert0.1.x
und nicht akzeptiert0.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).^
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
quelle
Hat Anpassung betrachtet werden kann „gebrochen“ , weil es aktualisieren würde nicht
^0.1.2
zu0.2.0
. Wenn die Software auf dem Markt ist, verwenden Sie0.x.y
Versionen, 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 Version11.0.0
aussehen, und das sieht nicht sehr aussagekräftig aus und sieht tatsächlich verwirrend aus. Wenn Sie andererseits0.1.x
-> verwenden0.2.x
->0.3.x
Versionen Wenn die Software dann zu 100% fertig und mit allen Funktionen ausgestattet ist, wird sie als Version veröffentlicht.1.0.0
Dies 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.y
Versionierung, 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.0
nicht0.2.0
aktualisiert und der Code wird nicht beschädigt). Wenn die Software ausgereift ist, geben Sie sie frei1.0.0
und erhöhen Sie die Ziffer ganz links bei jeder Änderung Ihrer öffentlichen API (daher werden Benutzer^1.0.0
nicht2.0.0
aktualisiert und der Code wird nicht beschädigt).quelle
~ Tilde:
~
friert Dur- und Moll-Zahlen ein.^ Caret:
^
friert nur die Hauptzahl ein.quelle
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.
quelle
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
Beispiel: ~ 2.4.1 bedeutet, dass nach 2.4.x gesucht wird, wobei x etwas ist
Beispiel: ^ 2.4.1 bedeutet, dass nach 2.xx gesucht wird, wobei x etwas ist
quelle
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
quelle
semver ist in 3 Hauptabschnitte unterteilt, die durch Punkte unterbrochen sind.
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.
quelle
Tilde (~)
~4.13.3
bedeutet, dass nach 4.13.x gesucht wird, wobei x etwas ist und 4.14.0Caret (^)
^3.0.0
bedeutet, dass nach 3.xx gesucht wird, wobei x etwas istquelle
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.
quelle
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:
Weitere Informationen zur Syntax der semantischen Versionierung finden Sie im npm semver-Rechner .
Mehr aus der npm-Dokumentation Informationen zur semantischen Versionierung
quelle
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
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.quelle
~ 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).
quelle
Im Zusammenhang mit dieser Frage können Sie die Composer-Dokumentation zu Versionen lesen , aber hier kurz:
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 .
quelle