web-dev-qa-db-fra.com

Quelle est la différence entre tilde (~) et caret (^) dans package.json?

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 ~.

  1. Pourquoi ces modifications sont-elles apportées dans npm?
  2. Quelle est la difference entre tilde ~ et caret ^?
  3. Quels sont les avantages par rapport aux autres?
2992
Fizer Khan

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/ )

3466
jgillich

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.0
  • http://sometarballurl (cela peut être l'URL d'une archive qui sera téléchargée et installée localement
  • * Correspond à n'importe quelle version
  • latest Obtient la dernière version

La 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.

764
Ahmad

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.

semver table

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:

semver diagram

Source: "Feuille de suivi de versioning sémantique" .

490
pspi

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Utilisez calculateur npm semver pour les tests. (Bien que les explications pour ^ (inclure tout ce qui est supérieur à une version particulière dans la même gamme majeure) et ~ (inclure tout ce qui est supérieur à une version particulière dans la même gamme mineure) ne sont pas correctes à 100%, la calculatrice semble fonctionner correctement )
  • Vous pouvez également utiliser SemVer Check , ce qui ne vous oblige pas à choisir un package et offre également des explications.

Autoriser ou interdire les modifications

  • Version Pin: 1.2.3.
  • Utilisez ^ (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.
  • Utilisez ~ (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.
  • Le niveau le plus à droite Ommit: 0.2 signifie 0.2 <= v < 1. Diffère de ~ parce que:
    • La version de niveau omise à partir est toujours 0
    • Vous pouvez définir la version majeure de départ sans spécifier de sous-niveaux.

Toutes les possibilités (espérons-le)

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.

89
rofrol

~ 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.

84
alex

~: 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
52
haotang

^ 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-

28
Will Stern

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.
27
asdfasdfads

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

14
Avinash

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.

11
Mudassir

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 (^).

Le tilde (~)

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 caret (^)

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

11
Abdou Sameh

~ Tilde:

  • ~ gèle nombres majeur et mineur.
  • 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.
  • 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 il manquera la version 1.3.0.
  • Tilde (~) vous donne les versions correctives

^ Caret:

  • ^ ne gèle que le nombre 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.
  • Il vous mettra à jour le la version majeure la plus récente (le premier numéro).
  • ^ 1.2.3 correspondra à n’importe quelle version 1.x.x incluant la 1.3.0, mais la version 2.0.0 restera inactive.
  • Caret (^) vous offre également de nouvelles fonctionnalités rétrocompatibles.
9
Laxmi

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

5
Farhan Yaseen

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.

3
Rajashekhar Reddy

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:

  • Versions de correctifs: 1.0 ou 1.0.x ou ~ 1.0.4
  • Versions mineures: 1 ou 1.x ou ^ 1.0.4
  • Versions principales: * ou x

Pour plus d'informations sur la syntaxe de versioning sémantique, voir la calculatrice npm semver .

npm semantic versions in published packages§

Plus d'informations dans la documentation npm À propos des versions sémantiques

2
ElasticCode

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.

1
Jesse Chisholm

~ 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)

1
user2849063