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

67voto

haotc92 Points 92

~ : Raisonnable 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

19 votes

@kytwb - non. Dans le cas particulier des numéros de version zéro, le carat est équivalent au tilde. Ainsi, ^0.1.3 n'accepte que les versions 0.1.x et n'acceptera pas 0.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 paquets à version zéro sont toujours considérés comme instables ; selon les mots de semver.org , #4, "tout peut changer à tout moment" (y compris les changements incompatibles avec le passé).

44voto

Laxmi Points 2773

~ Tilde :

  • ~ gèle les numéros 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 changements potentiellement incompatibles.
  • Le tilde correspond au version mineure la plus récente (le chiffre du milieu).
  • ~1.2.3 correspondra à toutes les versions 1.2.x, mais il manquera la 1.3.0.
  • Le tilde (~) vous permet d'accéder aux versions de correction de bogues.

^ Caret :

  • ^ gèle 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.
  • Il vous informera de la version majeure la plus récente (le premier chiffre).
  • ^1.2.3 correspondra à n'importe quelle version 1.x.x, y compris la 1.3.0, mais il s'abstiendra pour la 2.0.0.
  • L'astérisque (^) vous offre également une nouvelle fonctionnalité compatible avec le passé.

2 votes

Le tilde correspond à la version la plus récente du patch (le dernier chiffre). L'insigne correspond à la version mineure la plus récente (le numéro du milieu).

1 votes

"gèle" est la meilleure explication.

0 votes

Caret fige le numéro de la version majeure et vous met à jour à la version majeure la plus récente (le premier numéro) ? Le numéro majeur est le premier numéro, donc cela n'a pas de sens.

44voto

Will Stern Points 1727

^ est 1.[any].[any] (dernière version mineure)
~ est 1.2. [any] (dernier patch)

Une bonne lecture est cet article de blog sur la façon dont semver s'applique à npm
et ce qu'ils font pour les faire correspondre la norme semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0

2 votes

Pas vrai : Plages 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

36voto

kuchumovn Points 191

La correspondance des chapeaux peut être considérée comme "cassée" parce qu'elle ne se met pas à jour. ^0.1.2 à 0.2.0 . Lorsque le logiciel est en cours d'utilisation 0.x.y et la correspondance des chapeaux ne correspondra qu'au dernier chiffre variable ( y ). Ceci est fait exprès. La raison en est que lorsque le logiciel évolue, l'API change rapidement : un jour, vous avez ces méthodes et le lendemain, vous avez ces méthodes et les anciennes ont disparu. Si vous ne voulez pas casser le code pour les personnes qui utilisent déjà votre bibliothèque, vous allez incrémenter la version majeure : par exemple 1.0.0 -> 2.0.0 -> 3.0.0 . Ainsi, au moment où votre logiciel sera enfin terminé à 100% et complet, il sera comme une version 11.0.0 et cela n'a pas l'air très significatif, et semble même confus. Si vous utilisiez, d'un autre côté. 0.1.x -> 0.2.x -> 0.3.x puis, lorsque le logiciel est enfin terminé à 100% et complet, il est publié en tant que version 1.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 : utiliser 0.x.y lorsque votre logiciel n'a pas encore atteint sa maturité et le publier en incrémentant le chiffre du milieu lorsque votre API publique est modifiée (les personnes qui ont des problèmes d'accès à l'information ne peuvent donc pas le faire). ^0.1.0 ne sera pas 0.2.0 mettre à jour et cela ne cassera pas leur code). Ensuite, lorsque le logiciel est mature, il faut le publier sous le nom de 1.0.0 et d'incrémenter le chiffre le plus à gauche à chaque fois que votre API publique est modifiée (par conséquent, les gens ayant ^1.0.0 ne sera pas 2.0.0 mettre à jour et que cela ne casse pas 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.

0 votes

Ce commentaire était ridiculement utile et ne semble pas être très bien documenté. Avez-vous un lien vers la documentation relative à ce comportement ? Cette réponse sur les projets v0 m'a beaucoup aidé.

0 votes

Je n'ai pas de lien : J'ai trouvé cette information aussi en googlant et en jouant avec le calculateur de version sémantique de npm. semver.npmjs.com

2 votes

Doit être ajouté à leur documentation d'une manière plus formelle. J'ai donné une conférence à Sony à mon équipe d'ingénieurs parce que cela semble être si facilement négligé. slides.com/proloser/semver-v0

33voto

Wael Abbas Points 2055

carat ^ incluent tout ce qui est supérieur à une version particulière dans la même gamme majeure.

tilde ~ inclure 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 :

  • Versions de correctifs : 1.0 ou 1.0.x ou ~1.0.4
  • Communiqués mineurs : 1 ou 1.x ou ^1.0.4
  • Principales versions : * ou x

Pour plus d'informations sur la syntaxe du versioning sémantique, voir le site Web de la Commission européenne. npm semver calculateur .

npm semantic versions in published packages§

Plus d'informations dans la documentation de npm À propos du versionnage sémantique

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