Après avoir effectué la mise à 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 ~
.
npm
?~
et caret ^
?Le tilde
~
correspond à la version de correctif la plus récente (le troisième numéro) de la version mineure spécifiée (le deuxième numéro).
~ 1.2.3 correspondra à toutes les versions de 1.2.x mais ne tiendra pas sur 1.3.0.Le curseur
^
est plus détendu. Il correspond à la version mineure la plus récente (le deuxième numéro) de la version majeure spécifiée (le premier numéro).
^ 1.2.3 correspondra à toute version 1.x.x, y compris 1.3.0, mais sera suspendu à la version 2.0.0.
(Ceci est une version modifiée et corrigée de http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/ )
J'aimerais é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 à la version exactement>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
(cela peut être l'URL d'une archive 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 comprennent les URL GitHub et les dépôts d'utilisateurs GitHub, les chemins locaux et les packages avec des balises npm spécifiques.
Npm permet d'installer une version plus récente d'un paquet que celle spécifiée. L'utilisation du tilde (~
) vous donne les versions de correctifs de bogues et caret (^
) vous donne également une nouvelle fonctionnalité compatible avec les versions antérieures.
Le problème est que les anciennes versions ne reçoivent généralement pas beaucoup de corrections de bogues, aussi npm utilise caret (^
) comme valeur 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 les versions sémantiques. Pour les versions 0.x.x, le curseur n'autorise que les mises à jour de correctif , c'est-à-dire qu'il se comporte comme le tilde. Voir "Caret Ranges"
Voici une explication visuelle des concepts:
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
1.2.3
.^
(comme tête). Autorise les mises à jour au deuxième niveau non nul de gauche: ^0.2.3
signifie 0.2.3 <= v < 0.3
.~
(comme la queue). Généralement, arrêtez le niveau le plus à droite ou définissez la valeur zéro si omis:~1
signifie 1.0.0 <= v < 2.0.0
~1.2
signifie 1.2.0 <= v < 1.3.0
.~1.2.4
signifie 1.2.4 <= v < 1.3.0
.0.2
signifie 0.2 <= v < 1
. Diffère de ~
parce que: 0
Définir le niveau majeur de départ et autoriser les mises à jour vers le haut
* or "(empty string) any version
1 v >= 1
Geler le niveau majeur
~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
Gel du niveau mineur
^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
Geler le niveau de patch
~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)
Interdit les mises à jour
1.2.3 1.2.3
^0.0.3 (0.0.3) 0.0.3
Remarque : Manquer majeur, mineur, correctif ou spécifier beta
sans numéro est identique à any
pour le niveau manquant.
Remarque : Lorsque vous installez un paquet ayant le niveau majeur 0
, la mise à jour n'installe que la nouvelle version au niveau bêta/pr! En effet, npm
définit ^
comme valeur par défaut dans package.json
et lorsque la version installée est semblable à 0.1.3
, il gèle tous les niveaux majeur/mineur/correctif.
~
corrige les nombres majeurs et mineurs. Il est utilisé lorsque vous êtes prêt à accepter les corrections de bogues dans votre dépendance, mais ne souhaitez pas de modifications potentiellement incompatibles.
^
ne corrige que le numéro majeur. Il est utilisé lorsque vous surveillez de près vos dépendances et que vous êtes prêt à modifier rapidement votre code si une version mineure sera incompatible.
En plus de cela, ^
est non pris en charge par les anciennes versions de npm, et doit être utilisé avec prudence.
Donc, ^
est un bon paramètre par défaut, mais ce n'est pas parfait. Je suggère de choisir avec soin et de configurer l'opérateur semver qui vous est le plus utile.
~
: Raisonnablement fermer à
~1.1.5: 1.1.0 <= accepted < 1.2.0
^
: Compatible avec
^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
^
vaut 1. [tout]. [Tout] (dernière version mineure)~
est 1.2. [Tout] (dernier correctif)
Une bonne lecture est this blog post sur comment 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-
La correspondance de chapeaux peut être considérée comme "cassée" car elle ne mettra pas à jour ^0.1.2
à 0.2.0
. Lorsque le logiciel est en cours d’utilisation, utilisez 0.x.y
versions et correspondance ne correspond au dernier chiffre variant (y
). C'est fait exprès. La raison en est que, tandis 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 ont disparu. Si vous ne voulez pas déchiffrer le code pour les personnes qui utilisent déjà votre bibliothèque, vous allez incrémenter la version principale: par exemple. 1.0.0
-> 2.0.0
-> 3.0.0
. Donc, au moment où votre logiciel sera enfin terminé à 100% et complet, ce sera comme la version 11.0.0
et cela ne semble pas très significatif, et semble déroutant. Si vous utilisiez, par contre, 0.1.x
-> 0.2.x
-> 0.3.x
versions, le logiciel est enfin terminé à 100% et complet, il est publié en tant que version. 1.0.0
et cela signifie "Cette version est une version de service à long terme, vous pouvez utiliser cette version de la bibliothèque dans votre code de production, et l'auteur ne changera pas tout ce qu'il fera demain ou le mois prochain n'abandonnera pas le paquet ".
La règle est la suivante: utilisez 0.x.y
la gestion des versions lorsque votre logiciel n'est pas encore arrivé à échéance et libérez-le en incrémentant le chiffre du milieu lorsque votre API publique change (par conséquent, les personnes ayant ^0.1.0
ne recevront pas 0.2.0
. mettre à jour et il ne sera pas casser leur code). Ensuite, lorsque le logiciel arrive à maturité, relâchez-le sous 1.0.0
et incrémentez le chiffre le plus à gauche chaque fois que votre API publique change (par conséquent, les personnes ayant ^1.0.0
ne recevront pas 2.0.0
update et elles ne le seront pas. casser leur 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.
ne explication de ligne
Le système de version standard est major.minor.build (par exemple 2.4.1).
npm vérifie et corrige la version d'un paquet particulier basé sur ces caractères
~: la version majeure est corrigée, la version mineure est corrigée, correspond à n'importe quel numéro de build
par ex. : ~ 2.4.1 signifie qu'il va vérifier 2.4.x où x est quelque chose
^: la version majeure est corrigée, correspond à n'importe quelle version mineure, correspond à n'importe quel numéro de build
par ex. : ^ 2.4.1 signifie qu'il va vérifier 2.x.x où x est n'importe quoi
Tilde ~ correspond à la version mineure, si vous avez installé un paquet ayant la version 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, il ne sera pas installé par ~. C'est la version mineure.
Caret ^ correspond à la version majeure. Si le paquet 1.4.2 est bloqué dans votre projet et que la version 1.5.0 est également disponible, ^ installera la version majeure. Cela ne vous permettra pas d'installer 2.1.0 si vous avez ^ 1.4.2.
Version fixe si vous ne voulez pas changer de version de paquet sur chaque installation, utilisez une version fixe sans caractère spécial, par exemple "1.4.2"
dernière version * Si vous voulez installer la dernière version, utilisez seulement * devant le nom du paquet.
Vous avez probablement déjà vu le tilde (~) et le caret (^) dans le package.json. Quelle est la différence entre eux?
Lorsque vous faites npm install moment --save, il enregistre l’entrée dans le package.json avec le préfixe caret (^).
En termes simples, le tilde (~) correspond à la version mineure la plus récente (le nombre du milieu). ~ 1.2.3 correspondra à toutes les versions 1.2.x mais manquera 1.3.0.
Le curseur (^), 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.x.x, y compris 1.3.0, mais ne tiendra pas sur 2.0.0.
Référence: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b
~ Tilde:
~
gèle nombres majeur et mineur.^ Caret:
^
ne gèle que le nombre majeur.Tilde (~)
la version majeure est corrigée, la version mineure est corrigée, correspond à n'importe quel numéro de build
"express": "~4.13.3"
~4.13.3
signifie qu'il va vérifier 4.13.x où x est quelque chose et 4.14.0
Caret (^)
la version majeure est corrigée, correspond à n'importe quelle version mineure, correspond à n'importe quel numéro de build
"supertest": "^3.0.0"
^3.0.0
signifie qu'il va vérifier 3.x.x où x est n'importe quoi
Le numéro de version est une 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 paquet.
npm utilise le tilde (~) et le caret (^) pour désigner le correctif et les versions mineures à utiliser respectivement.
Donc, si vous voyez ~ 1.0.2, cela signifie d’installer la version 1.0.2 ou la dernière version du correctif telle que 1.0.4. Si vous voyez ^ 1.0.2, cela signifie que vous devez installer la version 1.0.2 ou la dernière version de correctif ou mineur telle que 1.1.0.
carat ^
inclut 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 plage mineure.
Par exemple, pour spécifier des plages de version acceptables allant jusqu'à 1.0.4, utilisez la syntaxe suivante:
Pour plus d'informations sur la syntaxe de versioning sémantique, voir la calculatrice npm semver .
Plus d'informations dans la documentation npm À propos des versions sémantiques
Pas une réponse en soi, mais une observation qui semble avoir été négligée.
La description des gammes carats:
voir: 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.
Signifie que ^10.2.3
correspond à 10.2.3 <= v < 20.0.0
Je ne pense pas que c'est ce qu'ils voulaient dire. Tirer dans les versions 11.x.x à 19.x.x 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-nombres soient à un chiffre.
~ specfices aux versions mineures ^ spécifie aux versions majeures
Par exemple, si la version du paquet est 4.5.2, 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.x.x (VERSION PRINCIPALE)