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.
npm
vorgenommen?~
und Caret ^
?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/ )
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.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 umfassen GitHub-URLs und GitHub-Benutzerrepos, lokale Pfade und Pakete mit bestimmten npm-Tags
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
.
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:
Quelle: "Semantic Versioning Cheatsheet" .
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
1.2.3
.^
(wie head). Ermöglicht Aktualisierungen auf der zweiten Nicht-Null-Ebene von links: ^0.2.3
bedeutet 0.2.3 <= v < 0.3
.~
(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
.0.2
bedeutet 0.2 <= v < 1
. Unterscheidet sich von ~
durch: 0
gestartet.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.
~
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.
~
: 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
^
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-
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.
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
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.
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.
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 (^) 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
~ Tilde:
~
friert ein Haupt- und Nebennummern.^ Caret:
^
friert nur die Hauptnummer ein.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
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.
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:
Weitere Informationen zur Syntax der semantischen Versionierung finden Sie in npm semver calculator .
Weitere Informationen finden Sie in der Dokumentation zu npm Informationen zur semantischen Versionierung
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.
~ 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)