Versions de dépendances
Versioning Semantique
Les packages dans Yarn suivent le Versioning Semantique, aussi connu sous le nom de “semver”. Lorsque vous installez un nouveau package depuis un registre, il sera ajouté à votre package.json
avec un intervalle de version semver.
Ces versions se découpent en major.minor.patch
et ressemble à ceci : 3.14.1
, 0.42.0
, 2.7.18
. Chaque partie de la version est incrémentée en différentes occasions :
- Incrémentez
major
lorsque vous faites des changements qui cassent ou rendent incompatible l’API de votre package. - Incrémentez
minor
lorsque vous ajoutez de nouvelles fonctionnalités tout en étant rétro-compatible. - Incrémentez
patch
lorsque vous faites un correctif de bug tout en restant rétro-compatible.
Remarque : il y a parfois des “libellés” ou des “extensions” au format semver afin de signaler des versions comme des pré-releases ou des bétas (par exemple
2.0.0-beta.3
).
Lorsque des développeurs disent que deux versions semver sont “compatibles” avec une troisième, ils font référence à des changements rétro-compatibles (minor
et patch
).
Intervalles de versions
Lorsque vous spécifiez une dépendance, vous spécifiez son nom et un intervalle de versions dans votre package.json
, par exemple :
{
"dependencies": {
"package-1": ">=2.0.0 <3.1.4",
"package-2": "^0.4.2",
"package-3": "~2.7.1"
}
}
Vous noterez que nous avons plusieurs caractères en plus de la version. Ces caractères, >=
, <
, ^
et ~
, sont des operateurs et sont utilisés pour spécifier des intervalles de versions.
Le but des intervalles de versions est de spécifier quelles versions d’une dépendance fonctionneront avec votre code.
Comparateurs
Chaque intervalle de versions est constitué de comparateurs. Ces comparateurs sont simplement un opérateur suivi d’une version. Voici certains opérateurs basiques :
Comparateur | Description |
---|---|
<2.0.0 |
N’importe quelle version inférieure à 2.0.0 |
<=3.1.4 |
N’importe quelle version inférieure ou égale à 3.1.4 |
>0.4.2 |
N’importe quelle version supérieure à 0.4.2 |
>=2.7.1 |
N’importe quelle version supérieure ou égale à 2.7.1 |
=4.6.6 |
N’importe quelle version égale à 4.6.6 |
Remarque : si aucun opérateur n’est spécifié, alors
=
est considéré comme étant l’intervalle de version. Donc l’opérateur=
est en fait optionnel.
Intersections
Les comparateurs peuvent être combinés avec des espaces pour créer un ensemble de comparateurs. Cela crée une intersection des comparateurs inclus. Par exemple l’ensemble de comparateurs >=2.0.0 <3.1.4
signifie “Supérieur ou égal à 2.0.0
et inférieur à 3.1.4
“.
Unions
Un intervalle de versions complet peut contenir une union de plusieurs ensembles de comparateurs, groupés ensemble avec ||
. Si l’un des deux côté de l’union est satisfait, alors l’intégralité de l’intervalle de versions est satisfait. Par exemple, l’intervalle de versions <2.0.0 || >3.1.4
signifie “Inférieur à 2.0.0
ou supérieur à 3.1.4
“.
Tags de pré-release
Les versions peuvent également avoir des tags de pré-release (par exemple 3.1.4-beta.2
). Si un comparateur inclut une version avec un tag de pré-release, il ne concordera qu’avec les versions qui ont le même major.minor.patch
.
Par exemple, l’intervalle >=3.1.4-beta.2
concorderait avec 3.1.4-beta.2
ou 3.1.4-beta.12
, mais ne concorderait pas avec 3.1.5-beta.1
même si la version est techniquement “supérieure ou égale à” (>=
) la version 3.1.4-beta.2
.
Ce comportement est utile car les pré-releases ont tendance à contenir d’accidentels changements incompatibles avec les versions précédentes et généralement vous ne voulez pas récupérer de pré-releases en dehors de la version que vous avez spécifiée.
Intervalles de versions avancés
Intervalles avec trait d’union
Les intervalles avec un trait d’union (par exemple 2.0.0 - 3.1.4
) spécifient un espace inclusif. Si une partie de la version n’est pas précisée (par exemple 0.4
ou 2
), cette partie manquante est remplacée par des zéros.
Intervalle de version | Intervalle de version étendu |
---|---|
2.0.0 - 3.1.4 |
>=2.0.0 <=3.1.4 |
0.4 - 2 |
>=0.4.0 <=2.0.0 |
X-Ranges
Les syntaxes X
, x
ou *
peuvent être utilisées pour laisser non-spécifiée une partie de la version.
Intervalle de version | Intervalle de version étendu |
---|---|
* |
>=0.0.0 (n’importe quelle version) |
2.x |
>=2.0.0 <3.0.0 (doit vérifier la version majeure) |
3.1.x |
>=3.1.0 <3.2.0 (doit vérifier les parties majeure et mineure de la version) |
Si une partie de la version est manquante, la version est considérée comme étant un x-range.
Intervalle de version | Intervalle de version étendu |
---|---|
`` (chaîne vide) | * ou >=0.0.0 |
2 |
2.x.x ou >=2.0.0 <3.0.0 |
3.1 |
3.1.x ou >=3.1.0 <3.2.0 |
Intervalles avec tilde
En utilisant ~
avec une version mineure spécifiée, cela autorise la partie patch
à changer. En utilisant ~
avec uniquement la partie majeure spécifiée, cel autorise la partie mineure
à changer.
Intervalle de version | Intervalle de version étendu |
---|---|
~3.1.4 |
>=3.1.4 <3.2.0 |
~3.1 |
3.1.x ou >=3.1.0 <3.2.0 |
~3 |
3.x ou >=3.0.0 <4.0.0 |
Remarque : spécifier une pré-release avec un intervalle avec un tilde ne validera que les pré-releases avec la même version. Par exemple, l’intervalle de version
~3.1.4-beta.2
valide3.1.4-beta.4
mais pas3.1.5-beta.2
car la versionmajor.minor.patch
est différente.
Intervalles avec accent circonflexe
Cela autorise des changements qui ne modifient pas le premier chiffre non-égal à zéro dans la version. Par exemple le 3
dans 3.1.4
ou le 4
dans 0.4.2
.
Intervalle de version | Intervalle de version étendu |
---|---|
^3.1.4 |
>=3.1.4 <4.0.0 |
^0.4.2 |
>=0.4.2 <0.5.0 |
^0.0.2 |
>=0.0.2 <0.0.3 |
Remarque : par défaut, quand vous exécutez
yarn add [package-name]
cela utilisera un intervalle avec un accent circonflexe.
Si une partie de la version est laissée vide, les parties manquantes seront remplacées par des zéros. Cependant, cela autorisera quand même à ce que cette partie change.
Intervalle de version | Intervalle de version étendu |
---|---|
^0.0.x |
>=0.0.0 <0.1.0 |
^0.0 |
>=0.0.0 <0.1.0 |
^0.x |
>=0.0.0 <1.0.0 |
^0 |
>=0.0.0 <1.0.0 |
Ressources complémentaires
- Pour une spécification complète du fonctionnement du système de versioning, veuillez vous référer au README de
node-semver
. - Vous pouvez tester le système de versioning sur des packages existants en utilisant le calculateur de semver de npm.