Global is evil

Le saviez vous ? Il est possible de refuser d'installer un paquet npm en global !

Quand on vous demande par exemple :

npm install -g gulp  

On installe alors la commande au niveau du système. Ça veut dire que tous les projets hébergés sur votre OS vont utiliser la même version.

Alors, certes, on peut installer une version locale qui prendra le dessus. Mais dans ce cas, pourquoi polluer son environnement global ? Pour que la commande soit dans le path ? Voici une autre façon de procéder.

npm install gulp  

va donc installer le paquet dans un dossier node_modules du dossier courant. Ce qu'on ne sait pas forcément, c'est que quand un paquet propose un binaire, il est disponible dans node_modules/.bin/commande. Ainsi, pour notre exemple, on peut utiliser la commande de la sorte :

./node_modules/.bin/gulp

sans l'installer en global.

Oui, mais c'est trop chiant à taper :o

Alors on a deux solutions. La première est de se faire un alias. Ça a l'avantage d'être rapide :

alias gulp=$PWD/node_modules/.bin/gulp  

puis

gulp  

Si on se trouve dans un projet où la commande est installée en local, elle sera exécutée dans la version installée dans ce projet. Sinon, on se mange une erreur exprimant l'absence de la commande.

La deuxième solution est moins sexy, mais elle a l'avantage de fonctionner directement après avoir installé le projet. On va simplement utiliser un script npm. On va éditer package.json pour ajouter un script qui va juste lancer la commande :

{
  "scripts": {
    …
    "gulp": "gulp"
  }
}

Et on pourra alors appeler :

npm run gulp  

C'est un peu plus long à taper, mais le gros avantage, c'est que simplement après le npm install initial, la commande sera disponible sans rappeler au dev qu'il doit aussi installer tel ou tel package en global ou se créer un alias.

Hadrien

Hi, I'm a french Javascript Lead Developer, Web Architect from Toulouse, France. I've worked for 12 years for many projects with YUI, AngularJS, Aurelia.io and now React and React native.

Toulouse, France https://hadrien.eu