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


Après je suis passé à la dernière écurie 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, c'était un tilde(~) préfixe.

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

2242
2018-03-12 06:02


origine


Réponses:


En termes simples, le tilde correspond à la version mineure la plus récente   (le numéro du milieu). ~ 1.2.3 correspondra à toutes les versions 1.2.x mais sera   manque 1.3.0.

Le signe, d'autre part, est plus détendu. Il vous mettra à jour   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 gardera 2.0.0.

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


2626
2018-03-12 08:28



Je voudrais également ajouter la documentation officielle de npmjs qui décrit toutes les méthodes pour la spécificité de la 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" See npm semver - Tilde Ranges & semver (7)
  • ^version "Compatible avec la version" Voir npm semver - Les rangs du Caret & 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 (ceci 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 incluent les urls GitHub et les user repo GitHub, les chemins locaux et les paquets avec des tags npm spécifiques.


568
2017-09-16 06:25



NPM permet d'installer une version plus récente d'un paquet que celui spécifié. En utilisant tilde (~) vous donne des corrections de bogues et des corrections (^) vous donne également une nouvelle fonctionnalité compatible avec les versions précédentes.

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

semver table

Selon: "Semver a expliqué - pourquoi il y a un signe (^) dans mon paquet.json?".

Remarque 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 autorise uniquement pièce mises à jour, c'est-à-dire qu'il se comporte de la même manière que le tilde. Voir "Caret Ranges"

Voici une explication visuelle des concepts:

semver diagram

La source: "Cheatsheet de versionnement sémantique".


346
2017-07-30 20:40



~ corrige des numéros majeurs et mineurs. Il est utilisé lorsque vous êtes prêt à accepter des corrections de bogues dans votre dépendance, mais ne voulez pas de changements 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 plus de ça, ^ est non supporté par les anciennes versions de npm, et devrait être utilisé avec prudence.

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


74
2018-03-12 23:05



Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Utilisation calculateur de sempm npm pour tester. (Bien que les explications pour ^ (comprennent tout plus grand qu'une version particulière dans la même gamme majeure) et ~ (incluent tout plus grand qu'une version particulière dans la même gamme mineure) ne sont pas 100% correctes, la calculatrice semble bien fonctionner )
  • Alternativement, utilisez SemVer Check au lieu de cela, qui ne vous oblige pas à choisir un paquet et offre également des explications.

Autoriser ou interdire les modifications

  • Version pin: 1.2.3.
  • Utilisation ^ (comme la tête). Autorise les mises à jour au deuxième niveau non nul à partir de la gauche: ^0.2.3 veux dire 0.2.3 <= v < 0.3.
  • Utilisation ~ (comme la queue). Généralement geler le niveau le plus à droite ou mettre zéro si omis:
    • ~1 veux dire 1.0.0 <= v < 2.0.0
    • ~1.2 veux dire 1.2.0 <= v < 1.3.0.
    • ~1.2.4 veux dire 1.2.4 <= v < 1.3.0.
  • Ommit le plus à droite: 0.2 veux dire 0.2 <= v < 1. Diffère de ~ car:
    • Le démarrage de la version de niveau omis est toujours 0
    • Vous pouvez définir la version principale de démarrage sans spécifier de sous-niveaux.

Toutes (avec espoir) les possibilités

Définir le démarrage du niveau principal et autoriser les mises à jour vers le haut

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

Gel du niveau principal

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

Interdire les mises à jour

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Remarquer: Manquant majeur, mineur, correctif ou spécifiant beta sans nombre, est le même que any pour le niveau manquant.

Remarquer: Lorsque vous installez un package qui a 0 en tant que niveau majeur, la mise à jour n'installera que la nouvelle version beta / pr level! C'est parce que npm ensembles ^ 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 / correctifs.


66
2017-10-11 16:52



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

42
2018-06-27 16:12



Hat correspondant peut être considéré comme "cassé", car il ne sera pas mis à jour ^0.1.2 à 0.2.0. Lorsque le logiciel est en cours d'utilisation 0.x.y les versions et le chapeau correspondent seulement 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 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 ex. 1.0.0 -> 2.0.0 -> 3.0.0. Ainsi, au moment où votre logiciel est enfin terminé à 100% et complet, il sera comme la version 11.0.0 et cela n'a pas l'air très significatif, et semble vraiment déroutant. Si vous étiez, en revanche, en utilisant 0.1.x -> 0.2.x -> 0.3.x versions puis au moment où le logiciel est enfin fait à 100% 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: utiliser 0.x.y versionnage lorsque votre logiciel n'a pas encore mûri et le libérer en incrémentant le chiffre du milieu lorsque votre API publique change (donc les gens ayant ^0.1.0 ne sera pas 0.2.0 mettre à jour et il ne cassera pas leur code). Ensuite, lorsque le logiciel arrive à maturité, relâchez-le sous 1.0.0 et incrémenter le chiffre le plus à gauche chaque fois que votre API publique change (donc les personnes ayant ^1.0.0 ne sera pas 2.0.0 mettre à jour et il ne cassera 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.

21
2017-10-19 11:24



^ est 1. [any]. [any] (dernière version mineure)
~ est de 1,2 [tout] (dernier correctif)

Une bonne lecture est ce blog 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-0


20
2017-12-15 18:07



Une explication de doublure

Le système de gestion des versions 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 à tout numéro de build

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

^ : la version majeure est corrigée, correspond à une version mineure, correspond à un numéro de build

par exemple. : ^ 2.4.1 signifie qu'il va vérifier 2.x.x où x est quelque chose


8
2018-01-21 08:00



~ Tilde:

  • ~ correctifs numéros majeurs et mineurs.
  • Il est utilisé lorsque vous êtes prêt à accepter les corrections de bogues dans votre dépendance, mais ne veulent pas de changements potentiellement incompatibles.
  • Le tilde correspond à la dernière version mineure (le numéro du milieu).
  • ~ 1.2.3 va correspondre à toutes les versions 1.2.x, mais il manquera 1.3.0.
  • Tilde (~) vous donne des corrections de bogues

^ Caret:

  • ^ 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 à la dernière version majeure (le premier nombre).
  • ^ 1.2.3 correspondra à n'importe quelle version de 1.x.x, y compris 1.3.0, mais elle restera sur 2.0.0.
  • Caret (^) vous offre également une nouvelle fonctionnalité rétrocompatible.

3
2017-09-30 10:56



Tilde (~)

la version majeure est corrigée, la version mineure est corrigée, correspond à n'importe quelle version   nombre

"express": "~4.13.3" 

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

Caret (^) 

la version majeure est corrigée, correspond à une version mineure, correspond à n'importe quelle version   nombre

"supertest": "^3.0.0"

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


2
2018-03-09 12:21