Quelle est la syntaxe de la version bower (et npm)?

Bower me permet de spécifier les exigences de version pour les paquets en utilisant la syntaxe suivante:

"dependencies": {
  "<name>": "<version>",
},

Mais je n'ai pas pu trouver quelle est la syntaxe à utiliser pour le <version>. Je sais que je peux spécifier des versions pour être:

  • supérieur à une certaine version avec ">1.0.0"
  • supérieur ou égal à une version: ">=1.0.0"
  • , ou dans une certaine gamme: "1.0.0 - 2.0.0".

Je sais aussi qu'il existe une syntaxe de version commune contenant le tilde: "~1.0.0". Mais je suis Je ne sais pas ce que cela signifie Et si c'est la même chose que "=1.0.0".

Je suis également intéressé de savoir si je suis capable de spécifier plusieurs versions non consécutives, telles que exactement 1.0.3 plus des versions supérieures à 1.5.0, etc...

259
demandé sur XML 2013-09-26 17:50:37

5 réponses

En un mot, la syntaxe pour les numéros de version Bower (et NPM) est appelée SemVer, ce qui est l'abréviation de 'Semantic Versioning'. Vous pouvez trouver de la documentation pour la syntaxe détaillée de SemVer telle qu'utilisée dans Bower et NPM sur L'API pour l'analyseur semver dans Node/npm . Vous pouvez en apprendre plus sur la spécification sous-jacente (qui ne Pas mentionne ~ ou d'autres détails de syntaxe) à semver.org .

Il y a un super-handy Visual semver calculatrice Vous pouvez jouez avec, ce qui rend tout cela beaucoup plus facile à grok et test.

SemVer n'est pas qu'une syntaxe! Il a des choses assez intéressantes à dire sur les bonnes façons de publier des API, ce qui aidera à comprendre ce que signifie la syntaxe. Il est essentiel:

Une fois que vous avez identifié votre API publique, vous lui communiquez les modifications avec des incréments spécifiques à votre numéro de version. considérons un format de version de X. Y. Z (majeur.Mineur.Patch) . Corrections de bugs n'affectant pas L'incrément de L'API la version du correctif, les ajouts/modifications d'API rétrocompatibles incrémentent la version mineure et les modifications d'API rétrocompatibles incrémentent la version majeure.

Donc, votre question spécifique sur ~ concerne cette majeure.Mineur.Patch schéma. (Comme le fait l'opérateur caret connexe ^.) Vous pouvez utiliser ~ pour réduire la gamme de versions que vous êtes prêt à accepter soit:

  • modifications ultérieures au niveau du correctif à la même version mineure ("corrections de bugs ne pas affecter L'API " ), ou:
  • modifications ultérieures de niveau mineur à la même version majeure ( "ajouts/modifications d'API rétrocompatibles")

Par exemple: pour indiquer que vous allez prendre toute modification ultérieure au niveau du patch sur le 1.2.x tree, commençant par 1.2.0, mais inférieur à 1.3.0, vous pouvez utiliser:

"angular": "~1.2"
  or:
"angular": "~1.2.0"

Cela vous donne également les mêmes résultats que l'utilisation de la syntaxe .x:

"angular": "1.2.x"

Mais, vous pouvez utiliser la syntaxe tilde/~ pour être pair plus spécifique: si vous êtes seulement prêt à accepter les changements au niveau du patch commençant par 1.2.4, mais toujours inférieur à 1.3.0, vous utiliseriez:

"angular": "~1.2.4"

Déplacement à gauche, vers la version major , Si vous utilisez...

"angular": "~1"

... c'est le même que...

"angular": "1.x"
  or:
"angular": "^1.0.0"

...et correspond à tout changement mineur ou au niveau du patch supérieur à 1.0.0 et inférieur à 2.0:

Notez que la dernière variation ci-dessus: elle s'appelle une 'plage de carets'. Le curseur ressemble beaucoup à un >, donc vous seriez excusé de penser que cela signifie "toute version supérieure à 1.0.0". (J'ai certainement glissé dessus.) Nan!

Les Plages de carets sont essentiellement utilisées pour dire que vous ne vous souciez que du chiffre le plus significatif à gauche-généralement la version majeure-et que vous autoriserez tout changement mineur ou au niveau du patch qui n'affecte pas ce chiffre le plus à gauche. Pourtant, contrairement à une plage de tilde qui spécifie une version majeure, les plages de carets vous permettent de spécifier un mineur/patch précis le point de départ. Ainsi, alors que ^1.0.0 === ~1, une plage de carets telle que ^1.2.3 vous permet de dire que vous allez prendre toutes les modifications >=1.2.3 && <2.0.0. Vous ne pourriez pas faire cela avec une gamme de tilde.

Tout cela semble déroutant au début, quand vous le regardez de près. Mais faites un zoom arrière pendant une seconde, et pensez-y de cette façon: le curseur vous permet simplement de dire que vous êtes le plus préoccupé par tout chiffre significatif qui reste le plus. Le tilde vous permet de dire que vous êtes le plus préoccupé par n'importe quel chiffre est le plus juste. Le reste est un détail.

C'est la puissance expressive du tilde et du caret qui explique pourquoi les gens les utilisent beaucoup plus que la syntaxe simple .x: ils vous permettent simplement de faire plus. C'est pourquoi vous verrez le tilde utilisé souvent même là où .x servirait. À titre d'exemple, voir npm lui-même: son propre paquet.le fichier json inclut beaucoup de dépendances au format ~2.4.0, plutôt que le format 2.4.x qu'il pourrait utiliser par. En s'en tenant à ~, la syntaxe est cohérente tout au long d'une liste de 70+ dépendances versionnées, quel que soit le numéro de patch débutant acceptable.

De toute façon, il y a encore plus à SemVer, mais je n'essaierai pas de tout détailler ici. Vérifiez-le sur le readme du paquet node semver . Et assurez-vous d'utiliser la calculatrice de version sémantique pendant que vous vous entraînez et que vous essayez de comprendre comment fonctionne SemVer.


RE: numéros de Version non consécutifs: la dernière question D'OP semble être de spécifier numéros de version/plages non consécutifs (si je l'ai édité assez). Oui, vous pouvez le faire en utilisant l'opérateur "ou" double-pipe commun: ||. Comme ça:

"angular": "1.2 <= 1.2.9 || >2.0.0"
326
répondu XML 2016-04-27 07:46:23

Basée sur semver, vous pouvez utiliser

  • Plages De Trait D'Union X. Y. Z-A. B. C 1.2.3-2.3.4 Indique >=1.2.3

  • X-Plages 1.2.x 1.X 1.2.*

  • Plages De Tilde ~1.2.3 ~1.2 indique l'autorisation de modifications au niveau du correctif ou de modifications mineures de version.

  • Signe Des Plages ^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 [majeur, mineur, patch] tuple

    • ^1.2.x (signifie > = 1.2.0
    • ^0.0.x (signifie > = 0.0.0
    • ^0.0 (signifie > = 0.0.0
135
répondu Jerome Anthony 2015-08-06 01:49:24

Bower utilise semver syntaxe, mais voici quelques exemples rapides:

, Vous pouvez installer une version spécifique:

$ bower install jquery#1.11.1

Vous pouvez utiliser ~ pour spécifier 'toute version qui commence par ceci':

$ bower install jquery#~1.11

Vous pouvez spécifier plusieurs exigences de version Ensemble:

$ bower install "jquery#<2.0 >1.10"
75
répondu Wilfred Hughes 2014-06-09 19:53:43

Vous pouvez également utiliser le mot clé latest pour installer la version la plus récente disponible:

  "dependencies": {
    "fontawesome": "latest"
  }
13
répondu shacker 2015-10-26 19:04:15

S'il n'y a pas de numéro de patch, ~ équivaut à ajouter .x à la version non-tilde. S'il y a un numéro de patch, ~ autorise tous les numéros de patch > = celui spécifié.

~1     := 1.x
~1.2   := 1.2.x
~1.2.3 := (>=1.2.3 <1.3.0)

Je n'ai pas assez de points pour commenter la réponse acceptée, mais certaines informations de tilde sont en contradiction avec la documentation SemVer liée: "angular": "~1.2" will not match 1.3, 1.4, 1.4.9. Aussi "angular": "~1" et "angular": "~1.0" sont pas équivalent. Cela peut être vérifié avec le semver npm calculatrice.

7
répondu Decima 2016-02-11 17:28:42