NVM ou la gestion de versions de NodeJs

Indéniablement, NodeJs s'implante dans nos sociétés. Jusqu'à début 2015, nous avions peu de soucis de gestions de versions: les mises à jour apportés en règle générale de petites corrections / améliorations. Donc nous n'avions pas comme sous Android un phénomène de fragmentation à gérer. Et cela aussi bien sur le serveur de production, ou tout simplement pour les développeurs.

La fragmentation

Depuis 2015, la fusion entre le projet io.js et NodeJs fait que la donne a changé. Très rapidement, depuis la version Node 0.12.X, des évolutions rapides et majeures sont apparus ! Par exemple Node 0.12.X commence à introduire des fonctionnalités ES6, et la version suivante, la 4.X.X introduit elle une très grande partie des dites fonctionnalités ES6. Ce qui amène le développeur à les utiliser et commencer à produire des modules / applications NodeJs en ES6.

De même, depuis Node 4.X.X, une refonte de NPM est faite. Et la gestion des modules entre NPM 2 et NPM 3 a fortement changé. Notamment, en essayant de mettre "à plat" les dépendances, évitant d'avoir une arborescence de modules et de sous-modules lourdes et parfois redondantes. Nous pouvons installer NPM3 manuellement, mais ce dernier vient désormais avec Node 5.X.X qui lui même introduit des évolutions de NodeJS, l'intégration des dernières fonctionnalités ES6 et certaines ES7.

Bref, nous commençons à avoir un phénomène de fragmentation, comme le démontre ce petit diagramme:



Et malgré la popularité de Node 4.X.X, ce sont les vieilles versions qui restent majoritairement utilisés.

La question se pose donc: comment gérer sur son environnement plusieurs versions de NodeJs ? Tout simplement en utilisant NVM !

Découverte de NVM

C'est un projet que nous pouvons trouver sur le lien suivant: https://github.com/creationix/nvm. Son objectif est simple: proposer un outils gérant les versions de NodeJs sur son poste.

Ainsi, nous pouvons lui demander de charger une version spécifique de NodeJs et de io.js (peut-être que nous aurons aussi NodeChakra si ce dernier est un jour inclut dans Node. Le but étant de pouvoir remplacer le moteur NodeJs par une autre implémentation. En l’occurrence ici, celle de Microsofot ...).

Nous pourrons lister les versions installées et dire laquelle est active. Cela permet aux développeurs de non seulement pouvoir basculer d'une version à l'autre simplement, et rapidement. Mais aussi de s'assurer du comportement de son application entre les différentes versions, manuellement, via des tests unitaires, tests d'intégrations, etc ...

De base, le projet fonctionne sous Ubuntu et Mac Os X. Il existe des solutions pour Windows, tel que nvm-windows, mais non officiel au projet d'origine.

Pour l'installer, rien de plus simple, il suffit de faire les commandes suivantes:

> git clone https://github.com/creationix/nvm.git ~/.nvm
> cd ~/.nvm
> git checkout `git describe --abbrev=0 --tags`

Comme vous avez pu le voir, nous installons dans le répertoire ".nvm" l'outils, et ce sera dans ce répertoire que les différentes versions de NodeJs seront installées


Après, il faut faire en sorte que ce dernier soit accessible depuis le shell. Il faudra alors éditer les fichiers ".bashrc", ".profile" en conséquence:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

Une fois cela fait, nous aurez accès à la commande "nvm" avec les options suivantes:
  • install: pour installer une nouvelle version
  • use: pour utiliser une version téléchargée
  • which: pour connaître le chemin à la version en cours de NodeJs (qui sera dans le répertoire ".nvm")
  • ls: pour lister les versions téléchargées
  • ls-remote: pour lister les versions disponibles
  • current: pour voir quelle version nous utilisons
  • deactivate: pour restaurer la variable "PATH". Autrement dit, si vous aviez déjà un NodeJs d'installé, vous allez de nouveau travailler avec lui.

Voyons ce que ça donne, tapons:

> nvm ls-remote





Puis:

> nvm ls




Nous voyons que la version 5.X.X n'est pas installée. Nous allons l'installer:

> nvm install v5.6.0




Vérifions qu'elle soit bien présente:

> nvm ls



Et dans le répertoire ".nvm":




Voyons quelle version nous utilisons:

> npm --version
> nvm current




Nous voyons que nous utilisons le NodeJs par défaut. Du coup, nous allons modifier cela:

> nvm use v5.6.0




Et si nous retapons les commandes précédentes:

> npm --version
> nvm current




Nous travaillons désormais avec NodeJs 5.6.0 !


En revanche, il faut faire attention, car par défaut, si nous fermons notre shell, nous retombons sur la version de NodeJs installé par défaut sur le système. Si nous souhaitons changer, nous pouvons utiliser la commande "alias". Par défaut, elle a été lancé comme suit:

> nvm alias default node


Cette dernière indique que nous utilisons la version de NodeJs du système par défaut. Si nous souhaitons changer ça, il suffit de taper la ligne de commande suivante:

> nvm alias v5.6.0 node


Facile non ?

Lancer deux instances NodeJs avec des versions différentes

Avec nvm, il est tout à fait possible de faire cela. Pour ça, il suffit d'utiliser la commande "nvm run" en précisant la version de NodeJs que nous souhaitons et de le remplacer comme le lanceur de script NodeJs classique.

Ainsi, nous pouvons faire le cas suivant:

> nvm run v0.10.32 my-es5-app.js
> nvm run v5.6.0 my-es6-app.js


Bref, décidément très utile.

Commentaires

Posts les plus consultés de ce blog

ISO: liens & outils utiles

Plusieurs vraies instances de Chrome sur son poste

NodeJs et SSL: une petite analyse