4590 votes

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

Après avoir mis à jour 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 caret ^ préfixe. Auparavant, il s'agissait d'un tilde ~ préfixe.

  1. Pourquoi ces changements sont-ils effectués dans npm ?
  2. Quelle est la différence entre le tilde ~ et caret ^ ?
  3. Quels sont les avantages par rapport aux autres ?

60 votes

Pour info, vous pouvez empêcher les préfixes ou en utiliser un personnalisé en faisant : npm config set save-prefix='' . (Bâton ~ entre guillemets si c'est ce que vous préférez). Je fais personnellement cela et j'emballe sous film rétractable les choses en production.

25 votes

Tous les détails minutieux sur le fonctionnement et les différences entre le tilde et le caret : github.com/npm/node-semver#tilde-ranges-123-12-1

13 votes

Cet outil est une aide précieuse pour tester semver.npmjs.com

5279voto

jgillich Points 5987

Voir le Documents sur NPM et documentation sur les semences :

  • ~version "Approximativement équivalent à la version" vous mettra à jour vers toutes les futures versions du patch, sans incrémenter la version mineure. ~1.2.3 utilisera les versions de 1.2.3 à <1.3.0.

  • ^version "Compatible avec la version" vous mettra à jour vers toutes les futures versions mineures ou correctives, sans incrémenter la version majeure. ^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, telles que ^0.2.3

543 votes

Je le signale ici dans l'espoir d'attirer l'attention des personnes qui n'ont pas bien réfléchi à la question, mais ^ et ~ supposent que vous pouvez faire confiance aux versions mineures et intermédiaires de vos dépendances. Si vous publiez une bibliothèque et que vous voulez que d'autres personnes vous fassent confiance, N'ACCEPTEZ PAS aveuglément les dépendances en amont. Une mauvaise version ponctuelle de votre dépendance peut provoquer une réaction en chaîne en amont, et les gens viendront frapper à VOTRE porte lorsque les choses tourneront mal. C'est une autre raison importante d'utiliser npm shrinkwrap sur votre code de production.

36 votes

Vous pouvez également vous débarrasser de l'absurdité de npm qui fait précéder vos versions d'un préfixe ^ ou un ~ . Définissez cette option si vous souhaitez exercer un contrôle étroit sur vos versions : npm config set save-prefix=''

11 votes

@prasanthv a raison : de docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : Gammes de caret ^1.2.3 ^0.2.5 ^0.0.4. Permet les changements qui ne modifient pas le chiffre non nul le plus à gauche dans le tuple [major, minor, patch]. En d'autres termes, cela autorise les mises à jour de correctifs et de mineurs pour les versions 1.0.0 et supérieures, les mises à jour de correctifs pour les versions 0.X >=0.1.0, et aucune mise à jour pour les versions 0.0.X.

1326voto

Ahmad Points 3925

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.

valeur

desc

~version

"Approximativement équivalent à la version"
Voir npm semver - Plages de Tilde

^version

"Compatible avec la version"
Voir npm semver - Plages de carets

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

*

Correspond à n'importe quelle version

latest

Obtention de la dernière version

La liste ci-dessus n'est pas exhaustive. D'autres spécificateurs de version incluent les urls GitHub et les repo des utilisateurs GitHub, les chemins locaux et les paquets avec des balises npm spécifiques.

Docs officiels

31 votes

Il est également possible de spécifier une fourchette exacte de versions, par exemple 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 plus, et également pas 1.1.x et moins.

1 votes

Un lien plus spécifique à partir du lien ci-dessus -> docs.npmjs.com/files/package.json#dependencies

13 votes

"Approximately equivalent to version" et "Compatible with version" sont des moyens si frustrants et non spécifiques pour décrire le comportement de ~ et ^. Merci à @jgillich d'avoir fourni une vraie réponse !

834voto

pspi Points 4830

Npm permet d'installer une version plus récente d'un paquet que celle qui est spécifiée. L'utilisation du tilde ( ~ ) vous donne les communiqués de correction de bogues et le caret ( ^ ) vous offre également une nouvelle fonctionnalité rétrocompatible.

Le problème est que les anciennes versions ne reçoivent généralement pas beaucoup de corrections de bogues, c'est pourquoi npm utilise le caret ( ^ ) par défaut pour --save .

semver table

Selon : "Semver expliqué - pourquoi il y a une caret (^) dans mon package.json ?" .

Note 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.x.x, le signe d'insertion permet seulement patch mises à jour, c'est-à-dire qu'il se comporte de la même manière que le tilde. Voir "Gammes de soins"

Voici une explication visuelle de ces concepts :

semver diagram

Source : "Fiche d'information sur le versionnage sémantique" .

2 votes

Qu'en est-il de ^0.2.5 ? de docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : Gammes de caret ^1.2.3 ^0.2.5 ^0.0.4. Permet les changements qui ne modifient pas le chiffre non nul le plus à gauche dans le tuple [major, minor, patch]. En d'autres termes, cela autorise les mises à jour de correctifs et de mineurs pour les versions 1.0.0 et supérieures, les mises à jour de correctifs pour les versions 0.X >=0.1.0, et aucune mise à jour pour les versions 0.0.X.

18 votes

@rofrol toute version avant 1.0.0 est considérée comme instable et ces règles ne s'appliquent pas

3 votes

Donc votre explication n'est pas complète

142voto

rofrol Points 390

Semver

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

Autoriser ou refuser les modifications

  • Version avec broche : 1.2.3 .
  • Utilisez ^ (comme la tête). Permet les mises à jour au deuxième niveau non nul en partant de la gauche : ^0.2.3 signifie 0.2.3 <= v < 0.3 .
  • Utilisez ~ (comme la queue). Gèle généralement le niveau le plus à droite ou met 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 .
  • Omettre le niveau le plus à droite : 0.2 signifie 0.2 <= v < 1 . Diffère de ~ parce que :
    • La version de départ du niveau omis 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

Geler le 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 du 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)

Refuser les mises à jour

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Avis : Manquant majeur, mineur, patch ou spécifiant beta sans numéro, est la même chose que any pour le niveau manquant.

Avis : Lorsque vous installez un paquet qui a 0 comme niveau majeur, la mise à jour n'installera que la nouvelle version de niveau bêta/pr ! C'est parce que npm fixe ^ par défaut dans package.json et quand la version installée est comme 0.1.3 il gèle tous les niveaux majeurs/mineurs/patchs.

0 votes

Dire aux gens d'éviter de commencer des projets à partir de 0 parce que les développeurs de bibliothèques et de consommation ne comprennent pas le système est une solution terrible. Je pense que @asdfasdfads a de bien meilleures informations.

0 votes

@ProLoser Je pense simplement que le système devrait être simplifié, et que nous ne devrions pas utiliser de versions 0.x.

1 votes

Le cas d'utilisation autour du développement du début du cycle de vie et de la v0 a BEAUCOUP de sens. En apprenant comment la v0 se comporte correctement, j'attends avec impatience d'autres projets en début de cycle de vie. Cela signifie que vous pouvez avoir une API qui évolue rapidement avec beaucoup d'incompatibilité en arrière sans être obligé de déclarer votre projet comme 1.x (c'est-à-dire stable) alors qu'il ne l'est pas vraiment.

121voto

alex Points 4257

~ fixe les numéros majeurs et mineurs. Elle est utilisée lorsque vous êtes prêt à accepter des corrections de bogues dans votre dépendance, mais que vous ne voulez pas de changements potentiellement incompatibles.

^ fixe uniquement le numéro majeur. Elle est utilisée lorsque vous surveillez de près vos dépendances et que vous êtes prêt à modifier rapidement votre code si la version mineure est incompatible.

En plus de cela, ^ est non supporté par les anciennes versions de npm, et doit être utilisé avec précaution.

Donc, ^ est un bon défaut, mais il n'est pas parfait. Je suggère de choisir et de configurer soigneusement l'opérateur semver qui vous est le plus utile.

14 votes

Pas vrai : Gammes de caret ^1.2.3 ^0.2.5 ^0.0.4. Autorise les changements qui ne modifient pas le chiffre non nul le plus à gauche dans le tuple [major, minor, patch]. En d'autres termes, cela autorise les mises à jour de correctifs et de mineurs pour les versions 1.0.0 et supérieures, les mises à jour de correctifs pour les versions 0.X >=0.1.0, et aucune mise à jour pour les versions 0.0.X. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4

6 votes

Cette réponse est complètement fausse (comme beaucoup d'autres ici). Aucune d'entre elles ne corrige jamais un nombre majeur ! Comme @rofrol l'a dit, ^ garde simplement le chiffre non nul le plus à gauche inchangé. ~, d'autre part, n'autorise que les mises à jour de correctifs si la version mineure est spécifiée (par exemple ~1.2.3 ou ~1.2) et autorise les mises à jour mineures si la version mineure n'est pas spécifiée (par exemple ~1).

3 votes

@TheBaj Ils veulent dire "fixer" comme "définir" ("fixer") plutôt que "ajuster", afin que vous soyez tous d'accord sur la façon dont le numéro majeur est traité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X