Menu

Gérer plusieurs version de Node/NPM automatiquement

Publié en March 2021 - Développement mobile, Développement web, Logiciel Libre

nodejs-nvm

Problématiques multi-projets

Si vous gérez plusieurs projets, alors vous avez dû être confronté comme nous à des problèmes de compatibilité avec des paquets NPM lorsque vous êtes en développement sur votre machine selon l'age de votre projet.

Dans notre cas, nous développons encore activement des projets anciens pour lesquels nous utilisions à l'époque Gulp en version 3 pour compiler les fichiers Javascript et Sass/Less. Pour autant, pour les nouveaux projets, nous préférons toujours utiliser les versions les plus récentes des outils.

C'est là que la gestion des projets se complique, la version 3 de Gulp dans notre exemple n'est pas compatible avec les versions plus récente de Node.

 

NVM à notre secours !

NVM, pour Node Version Manager, permet comme son nom l'indique, d'avoir différentes versions de Node et de les faire cohabiter sur votre machine.

Pour installer NVM, vous pouvez exécuter la commande suivante :

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash

Pour l'utiliser, vous devez d'abord installer une version de Node puis dire à NVM de l'utiliser :

# Installer la version 10.10.0 de Node
nvm install 10.10.0

# Installer la version la plus récente de Node
nvm install node

# Utiliser la version 10.10.0 de Node
nvm use 10.10.0

# Utiliser la version la plus récente de Node
nvm use node

Vous avez désormais accès à n'importe quelle version de Node !

 

Utiliser automatiquement la bonne version de Node pour votre projet

Maintenant que NVM est en place, vous pouvez changer à n'importe quel moment votre version de Node. Encore faut-il se rappeler la version initial de ce projet...

NVM met à disposition dans sa documentation un script très pratique qui permet de passer sur la bonne version de Node dès que vous changez de dossier dans votre terminal. Ajoutez ce bout de code dans le fichier .zshrc

autoload -U add-zsh-hook
load-nvmrc() {
  local node_version="$(nvm version)"
  local nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$node_version" ]; then
      nvm use
    fi
  elif [ "$node_version" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

Lorsque vous démarrez un nouveau projet, vous pouvez maintenant exécuter la commande suivante qui créera un fichier .nvmrc à la racine de votre projet avec la version courante de Node.

node -v > .nvmrc

Vous n'aurez désormais plus à vous soucier de la version de Node utilisée !

 

Utilisation en équipe et CI/CD

L'avantage, c'est que vous pouvez porter ce fonctionnement à tous les développeurs qui travaillent sur votre projet pour vous assurer que tout le monde utilise bien la même version de Node. Mais également sur votre plateforme de CI/CD.

Chez WebLogin, nous utilisons la plateforme CircleCI pour tester en continu nos projets et les déployer sur les serveurs de test et de production. Nous souhaitons donc que CircleCI utilise la même version de Node que nous pour compiler les assets, pour cela nous utilisons la configuration suivante sur CircleCI.

- run:
    name: Install nvm
    command: |
      curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
      export NVM_DIR="$HOME/.nvm"
      [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
      nvm install

- run:
    name: Install npm dependencies
    command: |
      npm ci

Nous nous assurons ainsi que les versions de Node et NPM sont toujours respectées et que CircleCI ne cassera pas les tests et le déploiement en les mettant à jour de manière inopinée.