Petit rappel du semver avec npm
Tags: npm, semver, versioning
Published: 2021-07-01 14:38:07

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 `semver` c'est quoi ?

Le `semver` (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](https://semver.org/lang/fr/) nous donne la définition suivante pour comprendre la convention :

> Étant donné un numéro de version **MAJEURE.MINEURE.CORRECTIF**, il faut incrémenter :
>
> 1. le numéro de version **MAJEUR** quand il y a des changements non rétrocompatibles,
> 2. le numéro de version **MINEUR** quand il y a des ajouts de fonctionnalités rétrocompatibles,
> 3. 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 `npm` 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](https://semver.org/lang/fr/) 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)
- `latest` : 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](https://docs.npmjs.com/about-semantic-versioning), 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](https://semver.npmjs.com/). En fonction de lib `npm` 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 !

______

Merci d'avoir lu cet article ! 
Il a été posté initialement sur le [blog](https://www.younup.fr/blog/) de @younup_it :
 https://www.younup.fr/blog/petit-rappel-du-semver-avec-npm

______
Cover par [Paul Esch-Laurent](https://unsplash.com/@pinjasaur) sur [Unsplash](https://unsplash.com/photos/oZMUrWFHOB4)