Après avoir mis à niveau vers la dernière version stable node
et npm
, j'ai essayé npm install moment --save
. Il enregistre l'entrée dans le package.json
avec le ^
préfixe caret . Auparavant, c'était un ~
préfixe tilde .
- Pourquoi ces modifications sont-elles apportées
npm
? - Quelle est la difference entre tilde
~
et caret^
? - Quels sont les avantages par rapport aux autres?
node.js
npm
package.json
semantic-versioning
Fizer Khan
la source
la source
npm config set save-prefix=''
. (Collez~
les citations si c'est ce que vous préférez.) Personnellement, je fais cela et je recouvre les choses en production.Réponses:
Voir les documents NPM et les documents semver :
~ version "Approximativement équivalente à la version", vous mettra à jour vers toutes les futures versions de patch, sans incrémenter la version mineure.
~1.2.3
utilisera les versions 1.2.3 à <1.3.0.^ version "Compatible avec la version", vous mettra à jour vers toutes les futures versions mineures / correctives, sans incrémenter la version principale.
^2.3.4
utilisera les versions de 2.3.4 à <3.0.0.Voir les commentaires ci-dessous pour les exceptions, en particulier pour les versions antérieures à, comme ^ 0.2.3
la source
^
ou a~
. Réglez ceci si vous voulez avoir un contrôle serré sur vos versions:npm config set save-prefix=''
0.2.x
,2
n'est pas unmajor version
. Voilà pourquoi docs.npmjs.com utilisé les mots spécifiques:the left-most non-zero digit
. Et qu'en est-il de ce cas: ^ 0.0.4 signifie 0.0.4A
en 3 versions:0.0.1
,0.0.2
et0.0.3
. Il y a un bogue0.0.1
donc vous voulez en avoir au moins0.0.2
dans votre packageB
. Si vous écrivez,0.0.x
vous obtiendrez0.0.3
, ce qui est OK. Mais si un autre packageC
nécessite à la foisB
etA
et a également une contrainte,"A": "<0.0.2"
vous obtiendrez0.0.1
sans afficher de problème de conflit, ce qui n'est pas ce que vous voulez. L'utilisation de tilde~0.0.2
devrait vous aider à éviter ce problème.Je voudrais également ajouter la documentation officielle de npmjs qui décrit toutes les méthodes de spécificité de version, y compris celles mentionnées dans la question -
https://docs.npmjs.com/files/package.json
https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-
~version
"Approximativement équivalent à la version" Voir npm semver - Tilde Ranges & semver (7)^version
"Compatible avec la version" Voir npm semver - Caret Ranges & semver (7)version
Doit correspondre exactement à la version>version
Doit être supérieur à la version>=version
etc<version
<=version
1.2.x
1.2.0, 1.2.1, etc., mais pas 1.3.0http://sometarballurl
(il peut s'agir de l'URL d'une archive tar qui sera téléchargée et installée localement*
Correspond à n'importe quelle versionlatest
Obtient la dernière versionLa liste ci-dessus n'est pas exhaustive. Les autres spécificateurs de version incluent les URL GitHub et les référentiels utilisateur GitHub, les chemins locaux et les packages avec des balises npm spécifiques
la source
1.2.0 || >=1.2.2 <1.3.0
: Exactement 1.2.0, ou tout ce qui va de 1.2.2 à 1.3.0 (inclus), mais pas 1.2.1, ou 1.3.1 et au-dessus, et pas non plus 1.1 .x et ci-dessous."Approximately equivalent to version"
et"Compatible with version"
sont des façons frustrantes et non spécifiques de décrire les comportements ~ et ^. Merci @jgillich d'avoir fourni une réponse réelle!npm permet d'installer une version plus récente d'un package que celle spécifiée. L'utilisation de tilde (
~
) vous donne des versions de correction de bogues et caret (^
) vous offre également de nouvelles fonctionnalités rétrocompatibles.Le problème est que les anciennes versions ne reçoivent généralement pas beaucoup de corrections de bugs, donc npm utilise caret (
^
) par défaut pour--save
.Selon: "Semver a expliqué - pourquoi il y a un caret (^) dans mon package.json?" .
Notez que les règles s'appliquent aux versions supérieures à 1.0.0 et que tous les projets ne suivent pas le versionnement sémantique. Pour les versions 0.xx, le signe d'insertion autorise uniquement les mises à jour de correctifs , c'est-à-dire qu'il se comporte de la même manière que le tilde. Voir "Gammes Caret"
Voici une explication visuelle des concepts:
Source: "Cheatsheet Semantic Versioning" .
la source
Semver
Autoriser ou interdire les modifications
1.2.3
.^
(comme la tête). Permet des mises à jour au deuxième niveau non nul à partir de la gauche:^0.2.3
signifie0.2.3 <= v < 0.3
.~
(comme la queue). Gèle généralement le niveau le plus à droite ou fixe zéro s'il est omis:~1
veux dire1.0.0 <= v < 2.0.0
~1.2
signifie1.2.0 <= v < 1.3.0
.~1.2.4
signifie1.2.4 <= v < 1.3.0
.0.2
signifie0.2 <= v < 1
. Diffère~
parce que:0
Toutes les possibilités (espérons-le)
Définir le démarrage au niveau principal et autoriser les mises à jour vers le haut
Geler le niveau majeur
Geler le niveau mineur
Geler au niveau du patch
Interdire les mises à jour
Remarque : Manquant majeur, mineur, patch ou spécifiant
beta
sans numéro, est le même queany
pour le niveau manquant.Remarque : lorsque vous installez un package dont le niveau est
0
majeur, la mise à jour installe uniquement une nouvelle version de niveau bêta / pr! C'est parce que lesnpm
paramètres^
par défaut danspackage.json
et lorsque la version installée est similaire0.1.3
, cela gèle tous les niveaux majeurs / mineurs / correctifs.la source
~
corrige les nombres majeurs et mineurs. Il est utilisé lorsque vous êtes prêt à accepter des corrections de bogues dans votre dépendance, mais que vous ne voulez pas de modifications potentiellement incompatibles.^
fixe le nombre majeur uniquement. Il est utilisé lorsque vous surveillez de près vos dépendances et êtes prêt à modifier rapidement votre code si une version mineure est incompatible.En plus de cela,
^
n'est pas pris en charge par les anciennes versions de npm et doit être utilisé avec prudence.C'est donc
^
un bon défaut, mais ce n'est pas parfait. Je suggère de choisir et de configurer soigneusement l'opérateur semver qui vous est le plus utile.la source
~
: Raisonnablement proche de^
: Compatible avecla source
^0.1.3
que les versions0.1.x
et n'acceptera pas0.2.0
, même s'il s'agit d'un incrément mineur. Ce comportement est équivalent à~0.1.3
. Le raisonnement derrière ce comportement est dû au fait que les packages de version zéro sont toujours considérés comme instables; dans les mots de semver.org , # 4, "tout peut changer à tout moment" (y compris les changements incompatibles en arrière).^
est 1. [tout]. [tout] (dernière version mineure)~
est 1.2. [tout] (dernier patch)Une bonne lecture est ce billet de blog sur la façon dont semver s'applique à npm
et ce qu'ils font pour le faire correspondre à la norme semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0
la source
La correspondance des chapeaux peut être considérée comme "rompue" car elle ne sera pas mise
^0.1.2
à jour0.2.0
. Lorsque le logiciel fait son apparition, utilisez les0.x.y
versions et la correspondance des chapeaux ne correspondra qu'au dernier chiffre variable (y
). C'est fait exprès. La raison en est que pendant que le logiciel évolue, l'API change rapidement: un jour, vous avez ces méthodes et l'autre jour, vous avez ces méthodes et les anciennes sont parties. Si vous ne voulez pas casser le code pour les personnes qui utilisent déjà votre bibliothèque, vous allez incrémenter la version principale: par exemple1.0.0
->2.0.0
->3.0.0
. Donc, au moment où votre logiciel sera enfin terminé à 100% et complet, il ressemblera à une version11.0.0
et cela ne semble pas très significatif et semble confus. Si vous utilisiez en revanche0.1.x
->0.2.x
->0.3.x
versions de , puis au moment où le logiciel sera enfin terminé à 100% et complet, il sera publié en tant que version1.0.0
et cela signifie "Cette version est un service à long terme, vous pouvez continuer et utiliser cette version de la bibliothèque dans votre code de production, et l'auteur ne changera pas tout demain ou le mois prochain, et il n'abandonnera pas le paquet".La règle est la suivante: utilisez le
0.x.y
contrôle de version lorsque votre logiciel n'est pas encore arrivé à maturité et libérez-le en incrémentant le chiffre du milieu lorsque votre API publique change (par conséquent, les personnes n'ayant^0.1.0
pas de0.2.0
mise à jour et ne cassent pas leur code). Ensuite, lorsque le logiciel arrive à maturité, relâchez-le1.0.0
et incrémentez le chiffre le plus à gauche à chaque fois que votre API publique change (par conséquent, les personnes n'ayant^1.0.0
pas de2.0.0
mise à jour et ne cassent pas leur code).la source
~ Tilde:
~
se fige les nombres majeurs et mineurs.^ Caret:
^
gèle uniquement le nombre majeur.la source
Tilde ~ correspond à la version mineure, si vous avez installé un package qui a 1.4.2 et après votre installation, les versions 1.4.3 et 1.4.4 sont également disponibles si dans votre package.json il est utilisé comme ~ 1.4.2 puis npm install dans votre projet après la mise à niveau installera 1.4.4 dans votre projet. Mais il y a 1.5.0 disponible pour ce paquet alors il ne sera pas installé par ~. Cela s'appelle une version mineure.
Caret ^ correspond à la version principale, si le package 1.4.2 est installé dans votre projet et après la sortie de votre installation 1.5.0, ^ installe la version principale. Il ne permettra pas d'installer 2.1.0 si vous avez ^ 1.4.2 .
Version fixe si vous ne voulez pas changer la version du package sur chaque installation, puis utilisez la version fixe sans aucun caractère spécial, par exemple "1.4.2"
Dernière version * Si vous souhaitez installer la dernière version, utilisez uniquement * devant le nom du package.
la source
Une explication de paquebot
Le système de version standard est major.minor.build (par exemple 2.4.1)
npm vérifie et corrige la version d'un package particulier en fonction de ces caractères
par exemple: ~ 2.4.1 signifie qu'il vérifiera 2.4.x où x est n'importe quoi
par exemple: ^ 2.4.1 signifie qu'il vérifiera 2.xx où x est n'importe quoi
la source
Vous avez probablement vu le tilde (~) et le caret (^) dans le package.json. Quelle est la différence entre eux?
Lorsque vous effectuez npm install moment --save, il enregistre l'entrée dans le package.json avec le préfixe caret (^).
Le tilde (~)
Dans les termes les plus simples, le tilde (~) correspond à la version mineure la plus récente (le chiffre du milieu). ~ 1.2.3 correspondra à toutes les versions 1.2.x mais manquera 1.3.0.
Le caret (^)
Le caret (^), en revanche, est plus détendu. Il vous mettra à jour vers la version majeure la plus récente (le premier numéro). ^ 1.2.3 correspondra à toute version 1.xx, y compris 1.3.0, mais tiendra le coup sur 2.0.0.
Référence: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b
la source
semver est séparé en 3 sections principales qui sont brisées par des points.
Ces différents correctifs majeurs, mineurs et correctifs sont utilisés pour identifier différentes versions. tide (~) et caret (^) utilisent pour identifier les versions mineures et correctives à utiliser dans la gestion des versions des packages.
la source
Tilde (~)
~4.13.3
signifie qu'il vérifiera 4.13.x où x est n'importe quoi et 4.14.0Caret (^)
^3.0.0
signifie qu'il vérifiera 3.xx où x est quelque chosela source
Le numéro de version est dans la syntaxe qui désigne chaque section avec une signification différente. la syntaxe est divisée en trois sections séparées par un point.
major.minor.patch 1.0.2
Major, minor et patch représentent les différentes versions d'un package.
npm utilise le tilde (~) et le caret (^) pour désigner respectivement le patch et les versions mineures à utiliser.
Donc, si vous voyez ~ 1.0.2, cela signifie installer la version 1.0.2 ou la dernière version de correctif telle que 1.0.4. Si vous voyez ^ 1.0.2, cela signifie installer la version 1.0.2 ou la dernière version mineure ou corrective telle que 1.1.0.
la source
carats
^
comprennent tout ce qui est supérieur à une version particulière dans la même gamme principale.tilde
~
inclut tout ce qui est supérieur à une version particulière dans la même gamme mineure.Par exemple, pour spécifier des plages de versions acceptables jusqu'à 1.0.4, utilisez la syntaxe suivante:
Pour plus d'informations sur la syntaxe de gestion des versions sémantique, consultez la calculatrice npm semver .
Plus d'informations sur la documentation de npm À propos du versioning sémantique
la source
Pas une réponse en soi, mais une observation qui semble avoir été oubliée.
La description des gammes de carats:
voir: https://github.com/npm/node-semver#caret-ranges-123-025-004
Des moyens qui
^10.2.3
correspondent10.2.3 <= v < 20.0.0
Je ne pense pas que c'est ce qu'ils voulaient dire. Tirer dans les versions 11.xx à 19.xx cassera votre code.
Je pense qu'ils voulaient dire
left most non-zero number field
. Il n'y a rien dans SemVer qui exige que les champs numériques soient à un seul chiffre.la source
~ spécfices pour les versions mineures ^ spécifie pour les versions majeures
Par exemple, si la version du package est 4.5.2, lors de la mise à jour, ~ 4.5.2 installera la dernière version 4.5.x (VERSION MINEURE) ^ 4.5.2 installera la dernière version 4.xx (VERSION MAJEURE)
la source
En relation avec cette question, vous pouvez consulter la documentation de Composer sur les versions , mais ici en bref:
Ainsi, avec Tilde, vous obtiendrez des mises à jour automatiques des correctifs, mais les versions mineures et majeures ne seront pas mises à jour. Cependant, si vous utilisez Caret vous obtiendrez des correctifs et des versions mineures, mais vous n'obtiendrez pas de versions majeures (changements de rupture).
La version de Tilde est considérée comme une approche «plus sûre», mais si vous utilisez des dépendances fiables (bibliothèques bien entretenues), vous ne devriez pas avoir de problèmes avec la version de Caret (car les modifications mineures ne devraient pas interrompre les modifications).
Vous devriez probablement consulter ce post stackoverflow sur les différences entre l'installation et la mise à jour de composer .
la source