Combien de fois vous êtes vous demandé, à quoi correspond un ^ ou encore un ~ devant une version de package ?
Dans cet article, on va essayer de faire simple mais surtout efficace pour enfin répondre à cette question !
Le <span class="css-span">semver</span> c'est quoi ?
Le <span class="css-span">semver</span> (pour Semantic Versioning) est la gestion sémantique des versions, en bon français.
Pour faire simple, c'est une façon de numéroter les versions de manière parlante en ajoutant du sens.
Le site semver.org nous donne la définition suivante pour comprendre la convention :
Étant donné un numéro de version MAJEURE.MINEURE.CORRECTIF, il faut incrémenter :
- le numéro de version MAJEUR quand il y a des changements non rétrocompatibles,
- le numéro de version MINEUR quand il y a des ajouts de fonctionnalités rétrocompatibles,
- le numéro de version de CORRECTIF quand il y a des corrections d’anomalies rétrocompatibles.
Cette convention est adoptée dans de nombreux langages et l'ensemble des packages <span class="css-span">npm</span> l'utilise.
Il y a aussi possibilité d'étendre ces notations pour inclure des phases de RC ou de beta par exemple. Je vous conseille la lecture du site semver.org qui sera plus exhaustif sur le sujet.
Les symboles dans le package.json
npm va venir enrichir ces notions avec des symboles pour appliquer des règles aux versions de packages.
Elles interviendrons notamment lors de vos npm install :
- ^ : cible les releases mineures (exemple : pour ^0.2.0, on peut avoir en version compatible 0.2.1, 0.3.0 et supérieure)
- ~ : cible les releases de corrections (exemple : pour ~0.2.0, on peut avoir en version compatible 0.2.1 mais pas 0.3.0)
- > : cibles les releases supérieures
- >= : cibles les releases supérieures ou égales
- <= : cibles les releases inférieures ou égales
- < : cibles les releases inférieures
- = ou pas de symbole : cible la release exacte
- - : cible les releases dans un intervalle (exemple : pour 0.2.0 - 0.4.2, on peut avoir en version compatible 0.2.1 et 0.3.0 mais pas 0.4.3)
- <span class="css-span">latest</span> : on utilise la dernière version du package
Avec le symbole ||, vous avez la possibilité de combiner des ensembles. Par exemple, ^0.2.0 || >=0.5.0 <1.2.0 cible les releases mineures à partir de 0.2.0 ou les releases à partir de 0.5.0 mais strictement inférieures à 1.2.0.
Le lien à avoir
Si, malgré ce tableau, vous vous faites toujours des nœuds au cerveau pour savoir ce qui se passe avec telle ou telle notation, npm vous propose ce calculateur de notation. En fonction de lib <span class="css-span">npm</span> ciblée et de votre combinaison, il va vous indiquer les versions cibles.
Conclusion
J'ai essayé d'être le plus minimal possible dans les descriptions des symboles. Dans la documentation de npm, il existe d'autres façons et exemples de combiner les symboles et les ensembles que je n'ai pas mentionnés car ils ne m'ont pas semblés pertinents (et je pense qu'ils ne vous serviront pas tous les jours).
J'ai rédigé cet article pour m'en faire un mémo, l'avoir toujours sous la main et le mettre dans mes favoris.
Vous pouvez en faire autant !
Benjamin, expert front Younup, aime le code smart, compréhensible et réutilisable. Malgré ses différentes tentatives de supprimer ES4 et Angular3 il a échoué, damn !
Ses technos de prédilection sont le Typescript, il adore transpiler en ES3 pour Internet Explorer, mais aussi le JavaScript. Hé oui, on peut tout faire avec (enfin aussi n’importe quoi…). Avouons-le, il a aussi un petit crush pour les PWA. Quand le web vient titiller le monde des apps natives et apporter une concurrence ultra positive !
Et si vous ne trouvez pas Benjamin derrière son écran se tirant les cheveux pour avoir oublié un CTRL+S, il devrait être sur un terrain, non loin du Saint Laurent, à travailler ses shoots…