Configurare correttamente l'installazione di pacchetti globali con npm su Linux

Configurare correttamente l'installazione di pacchetti globali con npm su Linux

Di mestiere faccio il programmatore e mi capita ultimamente di utilizzare molto Javascript. Chi lo usa sa bene che la riga di comando si utilizza spesso in questo ambito, soprattutto con l'utility npm per installare i pacchetti di terze parti.

Un classico problema che incontra il programmatore che utilizza Linux riguarda l'installazione dei pacchetti globali. Accade spesso infatti che questi pacchetti non si riescano ad installare perché per default npm cerca di installarli nelle directory di sistema (tipicamente /lib) ma l'utente con cui si opera normalmente non ha i diritti di scrittura per quella directory. Quello che si ottiene in questi casi è una lunga sequenza di errori npm ERR! Code EACCESS.

Una soluzione che si usa spesso per aggirare il problema è usare sudo e quindi installare i pacchetti come amministratore. Diciamolo subito: questa soluzione è sbagliata per diversi motivi. In primo luogo installare dei sorgenti fatti da terzi e poco controllati in una directory di sistema è un potenziale rischio di sicurezza. E poi accade a volte di scordarsi di usare sudo e rischiamo di trovarci alcuni pacchetti installati come root e altri installati col nostro utente, situazione che può portare ad errori nell'utilizzo dei pacchetti o in installazioni o upgrade successivi. Se poi la macchina su cui lavoriamo è condivisa da più utenti diversi allora la gestione dei diritti di accesso al repository di package globale può diventare un vero incubo!

Per fortuna la soluzione giusta c'è ed è molto semplice: creare una directory dei pacchetti globali per ogni utente.

Per farlo occorre, loggati col proprio utente, creare nella home una directory per contenere i pacchetti globali:


$ mkdir ~/.npm-global

e poi configurare npm per utilizzarla:


$ npm config set prefix '~/.npm-global'

Adesso quando useremo npm install -g i pacchetti globali saranno installati in /.npm-global e in pratica saranno riservati al nostro utente, senza andare ad "inquinare" la configurazione generale del sistema.

Manca però ancora una cosa da fare: se installiamo una utility da command line, come ad esempio @vue/cli questa sarà installata nella nostra directory dei pacchetti globali, e non sarà nel path dei comandi eseguibili. Occorre quindi aggiungere la directory ]/.npm-global/bin nel path. Per farlo basta editare il file .bashrc (se usate bash come shell) e aggiungere in fondo le seguenti righe:


if [ -d "$HOME/.npm-global/bin" ] ; then
    PATH="$HOME/.npm-global/bin:$PATH"
fi

Per fare una prova ad esempio si può installare @vue/cli:


$ npm install -g @vue/cli
...
+ @vue/cli@4.4.6
updated 1 package in 26.013s
$ vue -V 
@vue/cli 4.4.6
$ which vue
/home/maurizio/.npm-global/bin/vue

Quindi da ora in poi non dovrete mai usare sudo per installare i pacchetti globali di npm. Basta aggiungere il flag -g e potrete scordarvi l'incubo dell'errore EACCESS.

Currently there are no comments, so be the first!