2016-07-15 153 views
6

Stavo per avviare qualche sviluppo di node.js a casa, ma sono incappato in qualche comportamento strano quando installavo pacchetti npm a livello globale.npm imposta strane permesse per i pacchetti installati globalmente

Uso WebStorm come IDE e desidero utilizzare le funzionalità ECMAScript6, il che significa che devo trasporre i sorgenti, che WebStorm esegue utilizzando Babel.

Così ho provato ad installare Babel a livello globale:

$ sudo npm install -g babel-cli 

Quello che succede è che i file sono tutte belle accessibili da utente root, e la directory babel-cli e tutti i file e le directory in esso guardano bene finché Sembro root. Il problema nasce quando provo a guardare il pacchetto, o utilizzarlo, come un altro utente:

$ ls -l /usr/lib/node_modules/babel-cli/ 
ls: cannot access '/usr/lib/node_modules/babel-cli/lib': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/index.js': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/scripts': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/node_modules': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/package.json': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/README.md': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/bin': Permission denied 
total 0 
d????????? ? ? ? ?   ? bin/ 
d????????? ? ? ? ?   ? lib/ 
d????????? ? ? ? ?   ? node_modules/ 
d????????? ? ? ? ?   ? scripts/ 
-????????? ? ? ? ?   ? index.js 
-????????? ? ? ? ?   ? package.json 
-????????? ? ? ? ?   ? README.md 

Non importa quale pacchetto installo, tutti diventano in questo modo.

Sto usando node.js v6.3.0 e npm 3.10.3, su Ubuntu 16.04.

Ho installato node.js come richiesto here. Se provo ad aggiornare npm, lo stesso accade alla directory globale di npm e npm non è disponibile eccetto per root.

Quando vi elenco globale node_modules come utente vedo

$ ll /usr/lib/node_modules/ 
total 8,0K 
drwxr--r-- 6 nobody root 4,0K jul 15 23:50 babel-cli/ 
drwxr-xr-x 10 root root 4,0K jul 15 23:21 npm/ 

Oltre alla directory di essere di proprietà di nobody vedo niente di speciale.

Non ci sono ovviamente errori quando installo il pacchetto.

C'è qualcosa di sbagliato con npm e/o nodo? C'è qualcosa che non va in Ubuntu? O come ho installato il nodo? Quale potrebbe essere il motivo per cui qualcosa come succederà?

L'installazione locale funziona correttamente e per il pacchetto babel-cli è una soluzione accettabile per installarlo come pacchetto di sviluppo locale. Mi piacerebbe ancora sapere cosa succede quando si installano i pacchetti a livello globale e perché.


Problema answered here. Il problema non era correlato a npm e node.

+0

Io uso repository di origine nodo e Non ho visto questi problemi. Tuttavia, sto eseguendo il nodo 4.4 con un vecchio npm. Stai riscontrando il suo problema solo per babele? Che dire degli altri strumenti della CLI come grugniti, gulp, pergolati, ecc.? – tsturzl

+0

@tsturzl È lo stesso per tutti i pacchetti che installo a livello globale. –

+0

Non usare mai 'sudo' con' npm'. Stai solo chiedendo dei guai. Soffiare via il nodo, tutti i moduli e le directory di npm e installare tutto con le normali autorizzazioni utente. – xdumaine

risposta

5

Se si desidera installare un pacchetto a livello globale, basta usare un comando senza sudo come:

$ npm install -g <package> 

Se stai ricevendo EACCES o autorizzazioni errori, l'uso di sudo dovrebbe essere evitato, ma si deve invece risolvere le tue autorizzazioni in modo che npm possa essere eseguito senza sudo.

Questi errori vengono generati se non si dispone delle autorizzazioni per scrivere nella cartella che npm utilizza per memorizzare i pacchetti globali. Per risolvere questo, si può avviare da trovare qual è il percorso alla directory predefinita di NPM:

$ npm config get prefix 

Sulla maggior parte dei sistemi, sarà /usr/local e sarete in grado di risolvere i permessi su questa cartella.Se la cartella è /usr o /usr/lib, non è necessario modificare le autorizzazioni su questa directory poiché causerà alcuni problemi e in tal caso, in cui non si desidera modificare le autorizzazioni della directory predefinita, è possibile configurare npm per utilizzare una directory diversa .

Se si può e si vuole modificare le autorizzazioni per la cartella predefinita, è possibile utilizzare:

$ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} 

Cambierà il proprietario di directory di NPM al nome dell'utente corrente.

Se si vuole cambiare directory predefinita di NPM, si può iniziare con la creazione di questa nuova cartella:

$ mkdir ~/.npm-packages 

Poi, si configura NPM per utilizzare questa nuova cartella:

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

È Dovrai anche aggiungere questa nuova cartella al tuo PATH (ad esempio usando ~/.profile):

export PATH=~/.npm-packages/bin:$PATH 

A questo punto, è possibile aggiornare le variabili di sistema con source ~/.profile e test per installare un pacchetto globalmente senza utilizzare sudo.

Si dovrebbe essere in grado di installare il pacchetto senza ottenere alcun errore di autorizzazione dal momento che npm utilizzerà la cartella ~/.npm-packages.

È possibile trovare maggiori informazioni su questo argomento su npm documentation.

+0

I down-votato perché dare una proprietà utente non privilegiata delle directory di sistema in '/ usr' è sempre una cattiva idea, qualcosa che questa risposta sembra incoraggiare. Se si desidera installare i moduli globalmente (ad esempio nel sistema, in modo che altri utenti possano trarne vantaggio), è necessario farlo come utente 'root' o tramite' sudo'. Fare qualsiasi altra cosa è irresponsabile - sulla tua stessa macchina è un problema, ma insegnare agli sviluppatori che questo è il modo corretto, e poi andare a farlo sui loro server, è un disastro. – Guss

+0

La modifica delle autorizzazioni è suggerita solo quando l'impostazione predefinita di npm è '/ usr/local' e la risposta indica chiaramente che se si trova in un'altra directory, le autorizzazioni non dovrebbero essere modificate. Dall'altra parte, se pensi che modificare le autorizzazioni su/usr/local sia ancora una cattiva idea, forse dovresti [aprire immediatamente un problema su npm] (https://github.com/npm/npm/issues) perché questo è il modo ufficiale, documentato e consigliato di fissare le autorizzazioni: https://docs.npmjs.com/getting-started/fixing-npm-permissions – HiDeo

+0

Ho familiarità con quel documento idiota, e c'è già un bug su che: https://github.com/npm/docs/issues/745. il proprietario della documentazione NPM (almeno) sembra essere d'accordo. Spero solo che lo risolverà presto, come lei ha promesso. – Guss

0

Se si modifica l'utente che è necessario effettuare una delle operazioni seguenti, perché quando si è installato NPM in quel momento si sono installati come utente root, ma dopo tat si cambia l'utente e che ti dà errore di autorizzazione, perché questo indica che si fa non hai il permesso di scrivere nelle directory che npm usa per archiviare pacchetti e comandi globali.è possibile risolvere questo problema tramite: -

Utilizzare un gestore di pacchetti che si occupa di questo per voi.

Se si sta eseguendo una nuova installazione di nodo su Mac OS, è possibile evitare del tutto questo problema utilizzando il gestore di pacchetti Homebrew. Homebrew imposta le cose fuori dagli schemi con le autorizzazioni corrette. directory predefinita

brew install node 

O

Cambio di NPM in un'altra directory

Ci sono momenti in cui non si desidera modificare la proprietà della directory predefinita che NPM usi (ad esempio/usr) in quanto ciò potrebbe causare alcuni problemi, ad esempio se si condivide il sistema con altri utenti.

Invece, è possibile configurare npm per utilizzare una directory diversa del tutto. Nel nostro caso, questa sarà una directory nascosta nella nostra cartella Inizio.

Creare una directory per le installazioni a livello mondiale:

mkdir ~/.npm-global 

Configurare NPM per utilizzare il nuovo percorso della directory:

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

Aprire o creare un file ~/.profile e aggiungere questa riga:

export PATH=~/.npm-global/bin:$PATH 

Indietro sulla riga di comando, aggiornare le variabili di sistema:

source ~/.profile 

Test: Scarica un pacchetto globalmente senza utilizzare sudo.

npm install -g babel-cli 

Invece di passaggi 2-4 è anche possibile utilizzare la variabile ENV corrispondente (ad esempio, se non si desidera modificare ~/.profile):

NPM_CONFIG_PREFIX=~/.npm-global