web-dev-qa-db-fra.com

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

Bower me permet de spécifier les exigences de version pour les packages à l'aide de la syntaxe suivante:

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

Mais je n'ai pas été capable de trouver quelle est la syntaxe à utiliser pour le <version>. Je sais que je peux spécifier que les versions sont:

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

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

Je souhaite également savoir si je suis en mesure de spécifier plusieurs versions non consécutives, telles que exactement 1.0.3 plus les versions supérieures à 1.5.0, etc ...

271
Samuel Hapak

En un mot, la syntaxe des numéros de version de Bower (et des NPM) s'appelle SemVer, qui est l'abréviation de 'Semantic Versioning'. Vous pouvez trouver de la documentation sur la syntaxe détaillée de SemVer telle qu’elle est utilisée dans Bower et NPM sur l’API pour l’analyseur semver dans Node/npm . Vous pouvez en savoir plus sur la spécification sous-jacente (qui not ​​mentionne ~ ou d’autres détails de syntaxe) à l’adresse semver.org .

Il y a un calculateur visuel ultra-pratique avec lequel vous pouvez jouer, ce qui rend tout cela beaucoup plus facile à maîtriser et à tester.

SemVer n'est pas qu'une syntaxe! Il contient des informations assez intéressantes sur les bonnes manières de publier les API, ce qui aidera à comprendre ce que signifie la syntaxe. De manière cruciale:

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 (Major.Minor.Patch) . Les corrections de bugs n'affectant pas l'API incrémentent la version du correctif, les ajouts/modifications d'API compatibles ascendants incrémentent la version mineure et les changements d'API incompatibles ascendants incrémentent la version majeure.

Votre question spécifique à propos de ~ concerne donc ce schéma Major.Minor.Patch. (De même que l'opérateur de gardien associé ^.). Vous pouvez utiliser ~ pour réduire le nombre de versions que vous êtes prêt à accepter:

  • les modifications ultérieures au niveau du correctif dans la même version mineure ("les corrections de bugs n'affectant pas l'API"), ou:
  • modifications ultérieures de niveau mineur dans la même version majeure ("ajouts/modifications d'API compatibles avec les versions antérieures")

Par exemple: pour indiquer que vous apporterez les modifications ultérieures au niveau du correctif sur l’arborescence 1.2.x, à partir de 1.2.0, mais de moins de 1.3.0, vous pouvez utiliser:

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

Vous obtenez également les mêmes résultats que lorsque vous utilisez la syntaxe .x:

"angular": "1.2.x"

Cependant, vous pouvez utiliser la syntaxe tilde/~ pour être encore plus spécifique: si vous ne souhaitez accepter que les modifications au niveau des correctifs à partir de 1.2.4, mais toujours inférieur à 1.3 .0, vous utiliseriez:

"angular": "~1.2.4"

En allant à gauche, vers la version majeur, si vous utilisez ...

"angular": "~1"

... c'est pareil que ...

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

... et correspond à tout changement de niveau mineur ou de correctif supérieur à 1.0.0 et inférieur à 2.0:

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

Les gammes Caret sont essentiellement utilisées pour dire que vous vous souciez seulement ​​du chiffre le plus significatif à gauche - généralement la version majeure - et que vous autoriserez toute modification mineure ou de niveau de patch n'affectant pas ce chiffre le plus à gauche. Cependant, contrairement aux gammes tilde qui spécifient une version majeure, les gammes caret vous permettent de spécifier un point de départ mineur/correctif précis. Ainsi, alors que ^1.0.0 === ~1, une plage de caractères telle que ^1.2.3 vous permet de dire que vous prendrez toutes les modifications >=1.2.3 && <2.0.0. Vous ne pouvez pas faire cela avec une plage 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 réfléchissez de la façon suivante: le curseur vous permet simplement de dire que vous êtes le plus préoccupé par le chiffre significatif qui reste le plus à gauche. Le tilde vous permet de dire que vous êtes le plus préoccupé par le chiffre le plus à droite. Le reste est détaillé.

C'est le pouvoir expressif du tilde et du curseur qui explique pourquoi les gens les utilisent beaucoup plus que la syntaxe plus simple .x: ils vous laissent simplement en faire plus. C'est pourquoi vous verrez que le tilde est utilisé souvent même là où .x servirait. Par exemple, voir npm lui-même: son propre fichier package.json inclut de nombreuses dépendances au format ~2.4.0, plutôt que le format 2.4.x qu'il pourrait ​​utiliser. Si vous vous en tenez à ~, la syntaxe est cohérente sur toute une liste de plus de 70 dépendances versionnées, quel que soit le numéro de patch de début acceptable.

Quoi qu'il en soit, SemVer a encore beaucoup à faire, mais je ne vais pas essayer de tout détailler ici. Jetez-y un œil sur le fichier le fichier readme du paquetage semver du noeud . Et veillez à utiliser le calculateur de versioning sémantique pendant que vous vous entraînez et essayez de comprendre le fonctionnement de SemVer.


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

"angular": "1.2 <= 1.2.9 || >2.0.0"
337
XML

Basé sur semver , vous pouvez utiliser

  • Niveaux de trait d'union XYZ - ABC 1.2.3-2.3.4 Indique > = 1.2.3 <= 2.3.4

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

  • Tilde Ranges ~1.2.3 ~1.2 Indique les modifications de niveau de correctif ou les modifications de version mineures.

  • Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0.4

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

    • ^1.2.x (signifie> = 1.2.0 <2.0.0)
    • ^0.0.x (signifie> = 0.0.0 <0.1.0)
    • ^0.0 (signifie> = 0.0.0 <0.1.0)
138
Jerome Anthony

Bower utilise syntaxe semver , 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 commençant par ceci':

$ bower install jquery#~1.11

Vous pouvez spécifier plusieurs exigences de version simultanément:

$ bower install "jquery#<2.0 >1.10"
76
Wilfred Hughes

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

  "dependencies": {
    "fontawesome": "latest"
  }
13
shacker

S'il n'y a pas de numéro de correctif, ~ équivaut à ajouter .x à la version non-tilde. S'il existe 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 liée à semver: "angular": "~1.2" va pas correspondre à 1.3, 1.4, 1.4. 9 De plus, "angular": "~1" et "angular": "~1.0" sont pas équivalents. Ceci peut être vérifié avec le npm semver calculator .

7
Decima