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


3388

Après avoir mis à niveau vers la dernière version stable nodeet npm, j'ai essayé npm install moment --save. Il enregistre l'entrée dans le package.jsonavec le ^préfixe caret . Auparavant, c'était un ~préfixe tilde .

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

42
Pour votre information , vous pouvez éviter les préfixes ou utiliser une personnalisée en faisant: 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.
fncomp

19
Tous les petits détails sur le fonctionnement et les différences de tilde et de curseur
Jeffrey Martinez

11
Cet outil est un excellent assistant pour tester semver.npmjs.com
chaiyachaiya

@fncomp voulait juste clarifier si j'ai bien compris votre commentaire. Utilisez-vous uniquement des versions spécifiques des dépendances dans votre projet? notre équipe hésite à mettre à jour les dépendances .. recommanderiez-vous d'utiliser des versions spécifiques ou le préfixe '~' pour les dépendances ..?
blogs4t

@fncomp pourriez-vous s'il vous plaît détailler ce que vous voulez dire en disant: "Je fais personnellement cela et je recouvre les choses en production". Merci!
blogs4t

Réponses:


3849

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.3utilisera 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.4utilisera 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


325
Publier ici pour, espérons-le, attraper des personnes qui n'y réfléchissent pas vraiment, mais à la fois ^ et ~ suppose que vous pouvez faire confiance aux versions mineures et ponctuelles de vos dépendances. Si vous publiez une bibliothèque et que vous voulez que d'autres personnes vous fassent confiance, N'ACCEPTEZ PAS À L'AVEUGLE DES DÉPENDANCES EN AVAL. Une mauvaise libération de points de votre dépendance peut provoquer une réaction en chaîne en amont, et les gens vont frapper à VOTRE porte lorsque les choses vont en forme de poire. C'est une autre raison énorme d'utiliser le film rétractable npm sur votre code de production.
tehfoo

8
Vous pouvez également simplement supprimer toutes les absurdités de npm en ajoutant vos versions avec a ^ou a ~. Réglez ceci si vous voulez avoir un contrôle serré sur vos versions: npm config set save-prefix=''
kumarharsh

5
@prasanthv a raison: depuis docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0 .4. Permet des modifications qui ne modifient pas le chiffre non nul le plus à gauche dans le tuple [majeur, mineur, patch]. En d'autres termes, cela autorise les mises à jour correctives et mineures pour les versions 1.0.0 et supérieures, les mises à jour correctives pour les versions 0.X> = 0.1.0 et aucune mise à jour pour les versions 0.0.X.
rofrol

16
@jgillich in semver lorsque vous utilisez 0.2.x, 2n'est pas un major 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.4
rofrol

11
@FagnerBrack: L'exemple spécifique que vous avez fourni est correct, mais généralement votre façon de penser est fausse. Un exemple: Disons que ce de vous paquet Aen 3 versions: 0.0.1, 0.0.2et 0.0.3. Il y a un bogue 0.0.1donc vous voulez en avoir au moins 0.0.2dans votre package B. Si vous écrivez, 0.0.xvous obtiendrez 0.0.3, ce qui est OK. Mais si un autre package Cnécessite à la fois Bet Aet a également une contrainte, "A": "<0.0.2"vous obtiendrez 0.0.1sans afficher de problème de conflit, ce qui n'est pas ce que vous voulez. L'utilisation de tilde ~0.0.2devrait vous aider à éviter ce problème.
Maciej Sz du

863

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.0
  • http://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 version
  • latest Obtient la dernière version

La 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


8
Il est également possible de spécifier une gamme exacte de versions, comme 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.
CodeManX

Un lien plus spécifique à partir de ce qui précède -> docs.npmjs.com/files/package.json#dependencies
Toby

"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!
Scott Stafford

636

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.

table semver

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:

diagramme de semver

Source: "Cheatsheet Semantic Versioning" .


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

11
@rofrol toute version antérieure à 1.0.0 est considérée comme instable et ces règles ne s'appliquent pas
pspi

2
Donc, votre explication n'est pas complète
rofrol

5
@rofrol ouais, omettre la lisibilité est parfois bon, les chances d'avoir quoi que ce soit en dessous de 1.0.0 pour une dépendance dans le paquet json sont assez faibles. voir aussi le principe 20/80, est une excellente règle pour se concentrer sur ce qui compte
pspi

1
@pspi Avoir des versions inférieures à 1.0.0 est "peu probable"? Sur 60, nous en avons ~ 15, et la plupart d'entre eux ne sont pas obscurs.
Dave Newton

99

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Utilisez la calculatrice npm semver pour les tests. (Bien que les explications de ^ (inclure tout ce qui est supérieur à une version particulière dans la même plage principale) 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 SemVer Check à la place, 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 la tête). Permet des mises à jour au deuxième niveau non nul à partir de la gauche: ^0.2.3signifie 0.2.3 <= v < 0.3.
  • Utilisez ~(comme la queue). Gèle généralement le niveau le plus à droite ou fixe zéro s'il est omis:
    • ~1 veux dire 1.0.0 <= v < 2.0.0
    • ~1.2signifie 1.2.0 <= v < 1.3.0.
    • ~1.2.4signifie 1.2.4 <= v < 1.3.0.
  • Ommit niveau le plus à droite: 0.2signifie 0.2 <= v < 1. Diffère ~parce que:
    • Le démarrage de la version de niveau omis est toujours 0
    • Vous pouvez définir le démarrage de la version principale sans spécifier de sous-niveaux.

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

Définir le démarrage au niveau principal 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 au 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)

Interdire les mises à jour

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Remarque : Manquant majeur, mineur, patch ou spécifiant betasans numéro, est le même que anypour le niveau manquant.

Remarque : lorsque vous installez un package dont le niveau est 0majeur, la mise à jour installe uniquement une nouvelle version de niveau bêta / pr! C'est parce que les npmparamètres ^par défaut dans package.jsonet lorsque la version installée est similaire 0.1.3, cela gèle tous les niveaux majeurs / mineurs / correctifs.


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

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

1
Le cas d'utilisation autour du développement précoce du cycle de vie et de la version 0 a beaucoup de sens. Apprendre comment v0 se comporte correctement m'a fait me réjouir d'autres projets en début de cycle de vie. Cela signifie que vous pouvez avoir une API changeant rapidement avec beaucoup d'incompatibilité en arrière sans être obligé de déclarer votre projet comme 1.x (aka: stable) alors qu'il ne l'est vraiment pas.
ProLoser

Je le comprends, mais je n'aime tout simplement pas comment cela fonctionne avec semver et les qualificatifs
rofrol

2
Cela ressemble plus à une opinion et ne devrait pas être défini comme une approche généralement acceptée. Et ^ 0.1.x obtient des correctifs parfaitement bien.
ProLoser

93

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


13
pas vrai: Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Permet des modifications qui ne modifient pas le chiffre non nul le plus à gauche dans le tuple [majeur, mineur, patch]. En d'autres termes, cela autorise les mises à jour correctives et mineures pour les versions 1.0.0 et supérieures, les mises à jour correctives 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
rofrol

6
Cette réponse est complètement fausse (comme beaucoup d'autres ici). Rien de tout cela ne fixe jamais un nombre majeur! Comme l'a dit @rofrol, ^ maintient simplement inchangé le chiffre le plus à gauche non nul. ~ 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).
TheBaj

2
@TheBaj Ils signifient "réparer" comme "définir" ("fixer") plutôt que "ajuster", donc vous êtes tous d'accord sur la façon dont le nombre principal est traité.
maaartinus

1
Oui, cette réponse a semblé totalement à l'envers jusqu'à ce que je réalise que le répondeur voulait dire "réparer" comme dans "rendre fixe, stationnaire ou immuable".
NattyC

57

~: Raisonnablement proche de

   ~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

17
@kytwb - non. Dans le cas particulier des numéros de version zéro, le carat est équivalent au tilde. N'accepte donc ^0.1.3que les versions 0.1.xet 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 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).
chharvey

31

^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


2
pas vrai: Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Permet des modifications qui ne modifient pas le chiffre non nul le plus à gauche dans le tuple [majeur, mineur, patch]. En d'autres termes, cela autorise les mises à jour correctives et mineures pour les versions 1.0.0 et supérieures, les mises à jour correctives 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
rofrol

28

La correspondance des chapeaux peut être considérée comme "rompue" car elle ne sera pas mise ^0.1.2à jour 0.2.0. Lorsque le logiciel fait son apparition, utilisez les 0.x.yversions 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 exemple 1.0.0-> 2.0.0-> 3.0.0. Donc, au moment où votre logiciel sera enfin terminé à 100% et complet, il ressemblera à une version 11.0.0et cela ne semble pas très significatif et semble confus. Si vous utilisiez en revanche 0.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.ycontrô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.0pas de 0.2.0mise à jour et ne cassent pas leur code). Ensuite, lorsque le logiciel arrive à maturité, relâchez-le 1.0.0et incrémentez le chiffre le plus à gauche à chaque fois que votre API publique change (par conséquent, les personnes n'ayant ^1.0.0pas de 2.0.0mise à jour et ne cassent 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.

Ce commentaire était ridiculement utile et ne semble pas 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é.
ProLoser

Je n'ai pas de lien: j'ai aussi trouvé cette information en cherchant sur Google et en jouant avec le calculateur de version sémantique de npm semver.npmjs.com
catamphetamine

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

24

~ Tilde:

  • ~ se fige 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.
  • 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 il manquera 1.3.0.
  • Tilde (~) vous donne des versions de correction de bugs

^ Caret:

  • ^ gèle uniquement le nombre majeur.
  • 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.
  • Il vous mettra à jour version majeure plus récente (le premier numéro).
  • ^ 1.2.3 correspondra à toute version 1.xx, y compris 1.3.0, mais elle tiendra le coup sur 2.0.0.
  • Caret (^) vous offre également de nouvelles fonctionnalités rétrocompatibles.

1
Le tilde correspond à la version de patch la plus récente (le dernier numéro). Le signe d'insertion correspond à la version mineure la plus récente (le chiffre du milieu).
Abdul Rauf

"gèle" est la meilleure explication.
mhrabiee

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

19

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.


3
Cette réponse est trompeuse. SemVer indique clairement qu'un numéro de version normal DOIT prendre la forme XYZ [où] X est la version principale, Y est la version mineure et Z est la version du correctif.
Leo

15

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

~ : la version majeure est corrigée, la version mineure est corrigée, correspond à n'importe quel numéro de build

par exemple: ~ 2.4.1 signifie qu'il vérifiera 2.4.x où x est n'importe quoi

^ : la version principale est corrigée, correspond à n'importe quelle version mineure, correspond à n'importe quel numéro de build

par exemple: ^ 2.4.1 signifie qu'il vérifiera 2.xx où x est n'importe quoi


5
Je vois 7 lignes dans cette réponse
FluxLemur

11

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


Encore une fois, cette réponse est trompeuse. SemVer indique clairement qu'un numéro de version normal DOIT prendre la forme XYZ [où] X est la version principale, Y est la version mineure et Z est la version du correctif.
Leo

5

semver est séparé en 3 sections principales qui sont brisées par des points.

major.minor.patch
1.0.0

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.

~1.0.1
 Install 1.0.1 or **latest patch versions** such as 1.0.2 ,1.0.5
^1.0.1
 Install 1.0.1 or **latest patch and minor versions** such as 1.0.2 ,1.1.0 ,1.1.1

4

Tilde (~)

la version principale est fixe, la version mineure est fixe, correspond à n'importe quel numéro de build

"express": "~4.13.3" 

~4.13.3 signifie qu'il vérifiera 4.13.x où x est n'importe quoi et 4.14.0

Caret (^)

la version principale est fixe, correspond à n'importe quelle version mineure, correspond à n'importe quel numéro de build

"supertest": "^3.0.0"

^3.0.0 signifie qu'il vérifiera 3.xx où x est quelque chose


Pouvez-vous expliquer en quoi cette réponse est différente de la même réponse publiée il y a 4 ans ?
Franklin Yu

2

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.


1
Pouvez-vous expliquer en quoi cette réponse est différente de la même réponse publiée il y a 4 ans ?
Franklin Yu

2

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:

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

Pour plus d'informations sur la syntaxe de gestion des versions sémantique, consultez la calculatrice npm semver .

npm versions sémantiques dans les packages publiés§

Plus d'informations sur la documentation de npm À propos du versioning sémantique


1

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

Permet des modifications qui ne modifient pas le chiffre non nul le plus à gauche dans le tuple [majeur, mineur, patch].

Des moyens qui ^10.2.3correspondent10.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.


0

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


8
Pouvez-vous expliquer en quoi cette réponse est différente de la même réponse publiée il y a 4 ans ?
Franklin Yu

0

En relation avec cette question, vous pouvez consulter la documentation de Composer sur les versions , mais ici en bref:

  • Tilde Version Range ( ~ ) - ~ 1.2.3 est équivalent à> = 1.2.3 < 1.3.0
  • Plage de versions du curseur ( ^ ) - ~ 1.2.3 équivaut à> = 1.2.3 < 2.0.0

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 .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.