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

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

  1. pourquoi ces changements sont-ils effectués dans npm?
  2. Quelle est la différence entre tilde(~) et caret(^)?
  3. Quels sont les avantages par rapport aux autres?
2365
demandé sur Bruno Brant 2014-03-12 10:02:21

14 réponses

Dans les termes les plus simples, le tilde correspond à la version mineure la plus récente (nombre du milieu). ~ 1.2.3 correspondra à tous les 1.2.X versions mais sera Mlle 1.3.0.

Le curseur, en revanche, est plus détendu. Il vous mettra à jour à la version majeure la plus récente (le premier numéro). ^1.2.3 correspondra tout 1.x. x Libération y compris 1.3.0, mais se tiendra au large sur 2.0.0.

Http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/

Notez que la terminologie de l'auteur est quelque peu trompeuse: quand il dit "la version mineure la plus récente" pour ~ il signifie "la version la plus récente patch dans la version mineure spécifiée". De même pour^," la version majeure la plus récente "doit être lue comme"la version majeure la plus récente mineure dans la version majeure spécifiée".

2742
répondu jgillich 2018-08-31 09:54:26

Je voudrais également ajouter la documentation officielle 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 gammes & semver (7)
  • ^version " Compatible avec la version" Voir plages de SemVer - Caret npm & semver (7)
  • {[2] } 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 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 repo utilisateur GitHub, les chemins locaux et les packages avec des balises npm spécifiques

613
répondu Ahmad 2018-06-06 13:26:07

Npm permet d'installer une version plus récente d'un paquet que celui spécifié. L'utilisation de tilde (~) Vous donne des versions de correction de bugs et caret (^) vous donne é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 paquet.json?".

Notez que les règles s'appliquent aux versions supérieures à 1.0.0 et que tous les projets ne suivent pas le versionnage sémantique. Pour les versions 0.X. x le curseur n'autorise que les mises à jour patch, c'est-à-dire qu'il se comporte de la même manière que le tilde. Voir "Plages De Carets"

Voici une explication visuelle des concepts:

diagramme semver

Source: Sémantique"Versioning " Triche".

378
répondu pspi 2018-04-19 11:54:31

~ corrige les nombres majeurs et mineurs. Il est utilisé lorsque vous êtes prêt à accepter des corrections de bugs dans votre dépendance, mais que vous ne voulez pas de modifications potentiellement incompatibles.

^ fixe le nombre majeur seulement. Il est utilisé lorsque vous surveillez de près vos dépendances et que vous êtes prêt à changer rapidement votre code si une version mineure est incompatible.

En outre, ^ est pas pris en charge par de vieux mnp versions, et doit être utilisé avec prudence.

Donc, ^ est 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.

75
répondu alex 2014-09-20 13:45:39

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Utiliser mnp semver calculatrice pour les tests. (Bien que les explications de ^ (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)
  • alternativement, utilisez SemVer Check à la place, ce qui ne vous oblige pas à choisir un paquet et offre également explication.

Autoriser ou interdire les modifications

  • Broches version: 1.2.3.
  • utilisez ^ (comme la tête). Permet des mises à jour au deuxième niveau différent de zéro à partir de la gauche: ^0.2.3 signifie 0.2.3 <= v < 0.3.
  • utilisez ~ (comme la queue). Geler généralement le niveau le plus à droite ou Définir 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.
  • Ommit niveau le plus à droite: 0.2 signifie 0.2 <= v < 1. Diffère de ~ parce que:
    • le démarrage de la version de niveau omise est toujours 0
    • Vous pouvez définir le démarrage de la version majeure sans spécifier de sous-niveaux.

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

Définir le démarrage de niveau majeur et autoriser les mises à jour vers le haut

*  or "" (empty string)   any version
1                         v >= 1

Gel majeur au niveau de

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

Gel patch au niveau de

~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

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

Avis : lorsque vous installez un paquet qui a 0 comme niveau majeur, update n'installera que la nouvelle version beta/pr level! C'est parce que npm définit ^ par défaut dans package.json et lorsque la version installée est comme 0.1.3, elle gèle tous les correctifs majeurs/mineurs/ niveau.

68
répondu rofrol 2018-04-02 00:31:57

~ : 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
44
répondu haotang 2015-02-25 22:54:41

^ est 1.[tout].[tout] (dernière version mineure)
~ est 1.2.[tout] (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 faire correspondre la norme semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0

23
répondu Will Stern 2014-12-15 18:07:07

La correspondance de chapeau peut être considérée comme "cassée" parce qu'elle ne mettra pas ^0.1.2 à jour 0.2.0. Lorsque le logiciel est en train d'émerger, utilisez les versions 0.x.y et la correspondance hat ne correspondra qu'au dernier chiffre variable (y). Ceci est fait à dessein. 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 ont disparu. Si vous ne voulez pas casser le code pour les personnes qui utilisent déjà votre bibliothèque vous allez et incrémenter la version majeure: par exemple,1.0.0 -> 2.0.0 -> 3.0.0. Donc, au moment où votre logiciel est finalement 100% fait et complet, il sera comme la version 11.0.0 et cela ne semble pas très significatif, et semble en fait confus. Si vous étiez, d'autre part, en utilisant 0.1.x -> 0.2.x -> 0.3.x versions ensuite, au moment où le logiciel est finalement 100% fait et complet, il est publié en 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: utilisez 0.x.y versioning lorsque votre logiciel n'a pas encore mûri et libérez-le en incrémentant le chiffre du milieu lorsque votre API publique change (donc les personnes ayant ^0.1.0 ne recevront pas 0.2.0 Mise à jour et ne casseront pas 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 public Les modifications de L'API (par conséquent, les personnes ayant ^1.0.0 ne recevront pas 2.0.0 update et ne casseront 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.
23
répondu asdfasdfads 2016-09-23 11:56:25

Une explication de revêtement

Le système de version standard est majeur.mineur.construire (par exemple 2.4.1)

Npm vérifie et corrige la version d'un paquet particulier en fonction de ces caractères

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

par exemple: ~ 2.4.1 signifie qu'il vérifiera 2.4.x où x est quelque chose

^ : la version majeure est fixe, 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.X. X où x est quelque chose

10
répondu Avinash 2017-01-21 08:00:06

~ Tilde:

  • ~ corrige Nombres majeurs et mineurs.
  • Il est utilisé lorsque vous êtes prêt à accepter des corrections de bugs dans votre dépendance, mais ne veulent pas de changements potentiellement incompatibles.
  • le tilde correspond à la version mineure la plus récente (le numéro du milieu).
  • ~ 1.2.3 correspond à tous les 1.2.X versions, mais il manquera 1.3.0.
  • Tilde ( ~ ) vous donne des corrections de bugs

^ Curseur:

  • ^ fixe le nombre majeur seulement.
  • Il est utilisé lorsque vous surveillez de près vos dépendances et que vous êtes prêt à changer rapidement votre code si une version mineure est incompatible.
  • il vous mettra à jour vers la version majeure la plus récente (le premier nombre).
  • ^ 1.2.3 correspondra à n'importe quel 1.x. x Version, y compris 1.3.0, mais il tiendra sur 2.0.0.
  • Caret ( ^ ) vous offre également de nouvelles fonctionnalités rétrocompatibles.
5
répondu Laxmi 2016-12-26 11:03:43

Tilde (~)

Version Majeure est fixe, version mineure est fixe, correspond à tout construire nombre

"express": "~4.13.3" 

~4.13.3 signifie qu'il vérifiera 4.13.x où x est quelque chose et 4.14.0

Signe (^)

Version Majeure est fixe, correspond à une version mineure, correspond à tout construire nombre

"supertest": "^3.0.0"

^3.0.0 signifie qu'il va vérifier pour les 3.X. X où x est quelque chose

4
répondu Farhan Yaseen 2018-03-09 12:21:06

Vous avez probablement vu le tilde ( ~ ) et le caret ( ^ ) dans le paquet.json. Quelle est la différence entre eux?

Lorsque vous installez npm 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 nombre du milieu). ~ 1.2.3 correspondra à tous les 1.2.X versions mais manquera 1.3.0.

Le curseur (^)

Le caret ( ^ ), d'autre part, est de plus en plus détendu. Il vous mettra à jour vers la version majeure la plus récente (le premier numéro). ^1.2.3 correspondra à tout 1.x. x Version, y compris 1.3.0, mais tiendra sur 2.0.0.

Référence: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b

3
répondu Abdou Sameh 2018-08-31 09:46:53

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.

Majeur.mineur.patch 1.0.2

Majeurs, mineurs et patch représentent les différentes versions d'un paquet.

Npm utilise le tilde ( ~ ) et le caret ( ^ ) pour désigner les versions correctif et mineur à utiliser respectivement.

Donc, si vous voyez ~1.0.2, cela signifie 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 installer la version 1.0.2 ou la dernière version mineure ou patch telle que 1.1.0.

1
répondu Rajashekhar Reddy 2018-09-28 06:58:51

~ specfices aux versions mineures ^ spécifie les versions majeures

Par exemple, si la version du paquet est 4.5.2, lors de la mise à jour ~ 4.5.2 installera la dernière 4.5.version X (version mineure) ^4.5.2 installera le dernier 4.x.x version (VERSION MAJEURE)

0
répondu user2849063 2018-05-04 11:02:59