npm genera un errore senza sudo


1288

Ho appena installato node e npm attraverso il pacchetto su nodejs.org e ogni volta che provo a cercare o installare qualcosa con npm genera il seguente errore, a meno che non esegua il comando sudo. Ho la sensazione che si tratti di un problema di autorizzazioni? Sono già l'amministratore.

npm ERR! Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR!  { [Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/Users/chietala/.npm/-/all/.cache.json' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm ERR! System Darwin 12.2.0
npm ERR! command "node" "/usr/local/bin/npm" "search" "bower"
npm ERR! cwd /Users/chietala
npm ERR! node -v v0.10.4
npm ERR! npm -v 1.2.18
npm ERR! path /Users/chietala/.npm/-/all/.cache.json
npm ERR! code EACCES
npm ERR! errno 3
npm ERR! stack Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/chietala/npm-debug.log
npm ERR! not ok code 0

35
Si prega di considerare la soluzione utilizzando NVM : stackoverflow.com/a/24404451/1480391 (invece di hacking con autorizzazioni)
Yves M.

2
@janaspage Non è possibile installare il nodo o NVM (Node Version Manager) tramite NPM (Node Package Manager), non ha senso. NPM si trova all'interno del nodo (è installato contemporaneamente). Dai un'occhiata alla pagina di Wikipedia: en.wikipedia.org/wiki/Npm_(software)
Yves M.

5
Finalmente una soluzione migliore di sudo chown: github.com/sindresorhus/guides/blob/master/…
Dmitri Zaitsev

In OSX e nell'installazione del nodo con l'intaller pkg ufficiale 0 questa soluzione non ha funzionato. Ho usato questa invece: stackoverflow.com/a/34968008/675565
fmquaglia

2
Spiega il problema e la correzione: docs.npmjs.com/getting-started/fixing-npm-permissions
n00b

Risposte:


2269

Sembra un problema di autorizzazioni nella tua home directory. Per richiedere la proprietà della directory .npm eseguire:

sudo chown -R $(whoami) ~/.npm

102
Ho pensato che whoamifosse un segnaposto, ma funziona letteralmente così com'è, quindi deve essere una variabile che non capisco.
Semplicemente

127
whoami è un vero comando di shell en.wikipedia.org/wiki/Whoami . I backtick in giro whoamiassicurano che venga eseguito correttamente e quindi posto nel comando chown
Noah

13
puoi anche specificare manualmente il tuo nome utente. Se il tuo nome utente è "simpleascouldbe", il comando sarebbesudo chown -R simpleascouldbe ~/.npm
Noè,

13
npm NON richiede né dovresti usare sudo - vedi la risposta sotto @HeberLZ in particolare la sua seconda opzione relativa a: ./configure --prefix = xxxxxx
Scott Stensland

9
@ChristopherWill: questo non sta cambiando la proprietà di una directory di sistema. Questo sta cambiando la proprietà delle directory nella home directory dell'utente, che dovrebbe essere di proprietà dell'utente.
user4815162342,

620

Permessi che hai utilizzato quando sarà necessaria l'installazione di nodo quando fare le cose come scrivere nella directory NPM ( npm link, npm install -g, ecc).

Probabilmente hai eseguito l'installazione del nodo con i permessi di root, ecco perché l'installazione del pacchetto globale ti chiede di essere root.


Soluzione 1: NVM

Non hackerare con le autorizzazioni, installa il nodo nel modo giusto.

Su una macchina di sviluppo, non si deve installare ed eseguire il nodo con i permessi di root, altrimenti le cose piace npm link, npm install -gsarà necessario le stesse autorizzazioni.

NVM (Node Version Manager) ti consente di installare Node senza i permessi di root e ti permette anche di installare molte versioni di Node per giocare facilmente con loro .. Perfetto per lo sviluppo.

  1. Disinstalla nodo (probabilmente sarà richiesta l'autorizzazione di root). Questo potrebbe aiutarti.
  2. Quindi installare NVM seguendo le istruzioni in questa pagina .
  3. Installa nodo tramite NVM: nvm install node

Ora npm link, npm install -gnon ti sarà più necessario essere root.

Modifica: vedi anche https://docs.npmjs.com/getting-started/fixing-npm-permissions


Soluzione 2: installare i pacchetti a livello globale per un determinato utente

Non hackerare con le autorizzazioni, installa i pacchetti npm a livello globale nel modo giusto.

Se si utilizza OSX o Linux, è possibile creare una directory dedicata per l'utente per il pacchetto e l'installazione globalinpm e nodeper sapere come trovare i pacchetti installati a livello globale.

Dai un'occhiata a questo fantastico articolo per istruzioni dettagliate sull'installazione dei moduli npm a livello globale senza sudo.

Vedi anche: documentazione di npm sulla correzione delle autorizzazioni di npm .


32
Di tutte le soluzioni pubblicate la soluzione NVM qui mi ha fornito i risultati migliori. Consiglio vivamente di usare NVM piuttosto che giocare con le autorizzazioni.
wenincode,

9
Queste istruzioni hanno funzionato molto bene. Tuttavia probabilmente vorrai rimuovere i moduli che hai installato con sudo prima di disinstallare nodejs : npm ls -gp | awk -F/ '/node_modules/ && !/node_modules.*node_modules/ {print $NF}' | xargs npm -g rm- Ho dovuto reinstallare nodejs e in una shell di root e disinstallarli, altrimenti continuerai ad avere collegamenti simbolici a yo, grunt, ecc ...
Bruno Flávio,

4
Questa è la soluzione migliore, ho rimosso tutti i moduli prima facendo sudo npm list -g --depth=0. | awk -F ' ' '{print $2}' | awk -F '@' '{print $1}' | sudo xargs npm remove -g stackoverflow.com/a/22290968/1449157 e poi rimosso npme installato attraversonvm
Fabio Antunes

3
Per le istruzioni per l'uso di disinstallazione nodo questo SO risposta stackoverflow.com/a/11178106/480031
seangates

3
Perché è possibile utilizzare root per installare il nodo su una macchina di produzione?
Bruno Peres,

401

Inoltre avrai bisogno del permesso di scrittura nella node_modulesdirectory:

sudo chown -R $USER /usr/local/lib/node_modules

7
Così come la ~/tmpdirectory per me.
knownasilya,

123
Non so perché questo ottenga ancora voti. È una pessima pratica cambiare la proprietà delle directory di sistema per un determinato utente! Vedere la risposta di seguito per altre soluzioni (come la creazione di un gruppo separato per gli utenti del nodo).
Christopher Will,

1
non ho node_modulesdentro /usr/local/lib/. WTF?
Connor Leech,

27
Qualunque cosa tu faccia - ASSOLUTAMENTE non eseguire 'sudo chmod -R whoami' su / usr / local / lib o / usr / lib / rovinerai il tuo file sudoers e ti odierai.
qodeninja,

7
per favore, per favore, votate questo ... Then I ran sudo chown -R $USER /* and everything was fine- NO - state rovinando la vostra macchina.
commonpike,

75

Cambiare il proprietario su cartelle "globali di sistema" è un trucco. Su una nuova installazione, configurerei NPM per utilizzare una posizione già scrivibile per i programmi "utente globale":

npm config set prefix ~/npm

Quindi assicurati di aggiungere quella cartella al tuo percorso:

export PATH="$PATH:$HOME/npm/bin"

Vedi la risposta di @ErikAndreas ai moduli NPM non si installerà a livello globale senza sudo e una guida passo-passo più lunga di @sindresorhus con anche i set .$MANPATH


Sono pienamente d'accordo, tranne che suggerirei che se hai appena impostato il prefisso, in $HOMEgenere lo .profilescript si prenderà cura della $PATHprossima volta che lo procedi (ad esempio la prossima volta che accedi).
Jess Austin,

@JessAustin: Forse, ma porterà anche più confusione nel tuo $HOMEe potrebbe interferire con altri (futuri?) File / sottocartelle NPM. Preferisce tenere separati i file binari da diversi gestori di pacchetti / lingue / sistemi di compilazione e impostare esplicitamente $PATH(in uno script del tempo di accesso).
Joel Purra,

Eh, disordine? Stiamo solo parlando di moduli installati a livello globale in ~/lib/node_modules, con l'eventuale CLI associata in ~/bin. Per molti utenti, soprattutto se non hanno root, entrambi ~/bine ~/libgià esistono.
Jess Austin,

@JessAustin: è anche una questione di collisioni di nomi per biblioteche e binari. Supponiamo che punti NPM per inserire i binari ~/bine fare lo stesso per uno o due gestori di pacchetti aggiuntivi. Potrebbe non accadere oggi o domani, ma c'è il chiaro rischio che due pacchetti di gestori diversi abbiano una collisione di nomi e sovrascrivano i file degli altri. Questo è un caso abbastanza buono per me avere prefissi separati. (Esempi concreti sarebbero apprezzati.)
Joel Purra,

1
Questa dovrebbe essere accettata come la migliore risposta. La modifica delle cartelle globali del sistema può essere pericolosa.
Vladimir Marton,

58

Ho riscontrato questo durante l'installazione di Recess ( https://github.com/twitter/recess ) per compilare il mio CSS per Bootstrap 3.

Durante l'installazione dell'incasso:

-npm install recess -g
  1. Devi sbloccare le autorizzazioni nella tua homedirectory, come dice Noah :

    sudo chown -R `whoami` ~/.npm
  2. È inoltre necessario disporre delle autorizzazioni di scrittura per la node_modulesdirectory, come dice Xilo , quindi se continua a non funzionare, provare:

    sudo chown -R `whoami` /usr/local/lib/node_modules
  3. Se riscontri ancora errori, potresti anche dover correggere le /usr/localautorizzazioni :

    sudo chown -R `whoami` /usr/local

Si noti che, come indicato in questo post, in /usr/local/ realtà non è una directory di sistema se ci si trova su un Mac, quindi questa risposta è in realtà perfettamente "sicura" per gli utenti Mac. Tuttavia, se sei su Linux, vedi la risposta di Christopher Will qui sotto per una soluzione multiutente user friendly, sicura per il sistema (ma più complessa).


35
Questa è una cattiva idea. Probabilmente non si desidera che le directory di sistema siano di proprietà di un determinato utente. Oltre a gravi problemi di sicurezza, anche questo non è compatibile con più utenti.
Christopher Will

2
Sì, ma è un'ottima soluzione per un ambiente di sviluppo +2, soprattutto se hai già installato node.js e devi solo continuare a dondolare!
elliotrock,

Non dovresti davvero possedere pacchetti al di fuori della tua home directory
Ben

1
Se non si trova nella cartella principale, è una directory di sistema, nonostante qualsiasi affermazione contraria. Solo perché non è utilizzato da OS X non significa che non sia una directory di sistema.
ricco remer il

53

Attento!!! Attento!!! Attento!!!

chown o chmod NON è la soluzione, a causa del rischio per la sicurezza.

Invece fai questo, fai:

Primo controllo, dove npm punta, se chiami:

npm config get prefix

Se viene restituito / usr, è possibile effettuare le seguenti operazioni:

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

Questo crea una directory npm nella tua home directory e punta npmad essa.

Per rendere permanenti queste modifiche, devi aggiungere il comando export al tuo .bashrc:

echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc

dovrei passare all'opzione 2 solo se ho / usr?
Albert Laure,

3
Si noti che l'ultimo comando effettivamente genera il contenuto di $PATH, non la stringa stessa. Dovresti cambiarlo.
Veluria,

1
Questo l'ha risolto! Grazie. Stavo ottenendo "permesso negato, scollegamento" / usr / bin / <pkg> '
valbaca

1
Questa è la risposta migliore È il modo consigliato per risolvere il problema.
Paulo Coghi - Ripristina Monica il

Perché il chowning è un rischio per la sicurezza?
Frank,

40

Altre risposte suggeriscono di modificare le proprietà o le autorizzazioni delle directory di sistema per un utente specifico. Sconsiglio vivamente di farlo, questo può diventare molto imbarazzante e potrebbe rovinare l'intero sistema!

Ecco un approccio più generico e più sicuro che supporta anche multiutente.

Creare un nuovo gruppo per gli utenti nodo e aggiungere gli utenti richiesti a questo gruppo. Quindi impostare la proprietà dei file / directory dipendenti dal nodo su questo gruppo.

# Create new group
sudo groupadd nodegrp 

# Add user to group (logname is a variable and gets replaced by the currently logged in user)
sudo usermod -a -G nodegrp `logname`

# Instant access to group without re-login
newgrp nodegrp

# Check group - nodegrp should be listed as well now
groups

# Change group of node_modules, node, npm to new group 
sudo chgrp -R nodegrp /usr/lib/node_modules/
sudo chgrp nodegrp /usr/bin/node
sudo chgrp nodegrp /usr/bin/npm

# (You may want to change a couple of more files (like grunt etc) in your /usr/bin/ directory.)

Ora puoi installare facilmente i tuoi moduli come utente

npm install -g generator-angular

Alcuni moduli (grunt, bower, yo ecc.) Dovranno comunque essere installati come root. Questo perché creano collegamenti simbolici in / user / bin /.

modificare

3 anni dopo consiglierei di usare Node Version Manager . Ti fa risparmiare un sacco di tempo e problemi.


2
Se il nodo è installato dai sorgenti, sebbene il multiutente sia un problema, tutti i moduli funzionerebbero perfettamente senza l'uso di sudo. Questo è anche molto importante perché nel caso del modulo yeoman, le persone non possono aggiornare i generatori eseguendo il sudo dell'applicazione yeoman in quanto non consente l'esecuzione di sudo :(
HeberLZ

1
Su Linux, in genere utilizzo il staffgruppo integrato per fornire autorizzazioni alle mie cartelle di sviluppo. Inoltre, è una buona idea eseguire chmod g+ws node_modulesper assicurarsi che il tuo gruppo disponga dell'autorizzazione in lettura / scrittura.
jackvsworld,

@jackvsworld Non ero a conoscenza del gruppo del personale. Immagino che questa sarebbe una soluzione più fluida, dal momento che non si deve creare un nuovo gruppo fittizio ... anche se sarebbe meno esplicito. Ma grazie per questo contributo.
Christopher Will,

In generale, /usr/libè sotto il controllo del gestore dei pacchetti di sistema e non è necessario apportare modifiche.
rich remer

23

La documentazione ufficiale su come correggere le npm installautorizzazioni con un EACCESerrore si trova su https://docs.npmjs.com/getting-started/fixing-npm-permissions .

Ho riscontrato questo problema dopo una nuova installazione del nodo utilizzando il programma di .pkginstallazione su OSX. Ci sono ottime risposte qui, ma non ho ancora visto un link a npmjs.com.

Opzione 1: modifica l'autorizzazione nella directory predefinita di npm

  1. Trova il percorso della directory di npm:

    npm config get prefix

Per molti sistemi, questo sarà / usr / local .

ATTENZIONE : se il percorso visualizzato è solo / usr , passare all'opzione 2 .

  1. Cambia il proprietario delle directory di npm con il nome dell'utente corrente (il tuo nome utente!):

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

    Ciò modifica le autorizzazioni delle sottocartelle utilizzate da npm e alcuni altri strumenti ( lib / node_modules , bin e share ).

Opzione 2: modifica la directory predefinita di npm in un'altra directory

Ci sono momenti in cui non si desidera modificare la proprietà della directory predefinita utilizzata da npm (ovvero / usr ) poiché ciò potrebbe causare alcuni problemi, ad esempio se si condivide il sistema con altri utenti.

Invece, puoi configurare npm per usare una directory completamente diversa. Nel nostro caso, questa sarà una directory nascosta nella nostra cartella home.

  1. Crea una directory per installazioni globali:

    mkdir ~/.npm-global
  2. Configurare npm per utilizzare il nuovo percorso della directory:

    npm config set prefix '~/.npm-global'
  3. Apri o crea un file ~ / .profile e aggiungi questa riga:

    export PATH=~/.npm-global/bin:$PATH
  4. Tornando alla riga di comando, aggiorna le variabili di sistema:

    source ~/.profile

1
Grazie, questo ha funzionato per me come non lo era il solitario. Mi hai salvato.
fmquaglia,

dovrei passare all'opzione 2 solo se ho / usr?
Albert Laure,

Adoro l'opzione 2. di questa risposta (1) Non ha le vulnerabilità di sicurezza dell'uso di sudo, (2) conserva l'architettura per altri utenti, (3) fa riferimento alla documentazione E (4) ha la riga di comando necessaria voci incluse. Grazie per aver aggiunto!
Tom Rose,

Quindi cosa succede quando installi qualcosa in cui è collegato il link simbolico /usr/bin/? Ora solo il tuo utente può accedervi. Accedi come qualcun altro, ancora nessun accesso, poiché i file si trovano effettivamente nella home directory di un altro utente!
Frans,

Bello, questo ha funzionato per me. Grazie per la spiegazione in aggiunta ai comandi.
FrankByte.com,

12

Come se avessimo bisogno di più risposte qui, ma comunque ..

Sindre Sorus ha una guida Installa i pacchetti npm a livello globale senza sudo su OS X e Linux delineando come installare in modo pulito senza fare confusione con le autorizzazioni:

Ecco un modo per installare i pacchetti a livello globale per un determinato utente.

  1. Crea una directory per i tuoi pacchetti globali

    mkdir "${HOME}/.npm-packages"
  2. Fai riferimento a questa directory per un utilizzo futuro nel tuo .bashrc / .zshrc:

    NPM_PACKAGES="${HOME}/.npm-packages"
  3. Indicare a npm dove conservare il pacchetto installato a livello globale. Nel tuo $HOME/.npmrcfile aggiungi:

    prefix=${HOME}/.npm-packages
  4. Assicurarsi che il nodo li trovi. Aggiungi quanto segue al tuo .bashrc / .zshrc:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
  5. Assicurati di trovare binari e pagine man installate. Aggiungi quanto segue al tuo .bashrc/ .zshrc:

    PATH="$NPM_PACKAGES/bin:$PATH"
    # Unset manpath so we can inherit from /etc/manpath via the `manpath`
    # command
    unset MANPATH # delete if you already modified MANPATH elsewhere in your config
    MANPATH="$NPM_PACKAGES/share/man:$(manpath)"

Dai un'occhiata a npm-g_nosudo per eseguire automaticamente i passaggi precedenti

Dai un'occhiata alla fonte di questa guida per gli ultimi aggiornamenti.


2
tx per la modifica @AndyHayden :) Il mio metodo preferito è suggerito nei commenti sopra: usa NVM! stackoverflow.com/a/24404451/1480391
PTIM

L'unica soluzione che ha funzionato per me, che non comporta il caos con le autorizzazioni. Odio NPM e le sue stupide autorizzazioni idiote. Grazie per la soluzione!
RyanNerd,

8

TL; DR

utilizzare sempre sudo -io sudo -Hdurante l'esecuzione npm installper installare pacchetti globali.

-

Quando lo usi npmscarica i pacchetti nella tua home directory utente. Quando si esegue come sudo, npminstalla i file nella stessa directory, ma ora sono di proprietà di root.

Questo è ciò che accade assolutamente a ogni singola persona che abbia mai usato npm:

  • installa alcuni pacchetti locali senza problemi usando npm install foo
  • installa il pacchetto globale usando sudo install -g foo-clisenza problemi
  • tenta di installare il pacchetto locale con npm install bar
  • frustrati dai npmprogettisti ora che devi andare di chmodnuovo in una directory

Quando usi l' opzione -io -Hcon sudo, la tua home directory sarà rootla home directory. Qualsiasi installazione globale memorizzerà nella cache i pacchetti /root/.npmanziché i rootfile di proprietà in /home/me/.npm.

Basta usare sempre sudo -io sudo -Hquando si esegue npm installper installare pacchetti globali e i npmproblemi con le autorizzazioni si dissolveranno.

Per sempre.

http://hood.ie/blog/why-you-shouldnt-use-sudo-with-npm.html

- qv la risposta accettata per aver risolto un problema già fatto npm.


soluzione migliore e più semplice
Manjeet Singh

6

Ho avuto un problema simile ai moduli NPM che non si installano a livello globale senza sudo , il problema era che quando ho installato il nodo l'ho fatto con sudo tramite chris / lea ppa repo .

La mia soluzione era disinstallare il nodo e quindi installarlo in questo modo:

Scarica le ultime fonti di nodi stabili da nodejs.org #in my case node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz #uncompress source

cd node-v0.10.20 #enter cartella non compressa

sudo chown $ USER -R / usr / local

./configure --prefix = / usr / local && make && make install

PD: se non si desidera cambiare la proprietà della cartella / usr / local, è possibile installarla in un posto già posseduto. Il problema di questo approccio è che dovrai associare la cartella di installazione con la riga di comando bash in modo che possiamo usare il comando node in seguito

mkdir ~ / opt

./configure --prefix = ~ / opt && make && make install

echo 'export PATH = ~ / opt / bin: $ {PATH}' >> ~ / .bashrc #or ~ / .profile o ~ / .bash_profile o ~ / .zshenv a seconda del sistema operativo corrente

Con uno di questi approcci, sarai in grado di fare quanto segue senza usare sudo

npm install -g module_to_install


1
Ho finito con questo metodo. Ha usato sudo chown $USER /use/localprima di costruire. Sembra buono finora, tempo di provare a costruire atomo! Grazie!
prasanthv,

6

Quando si esegue npm install -g somepackage, è possibile che venga visualizzato un errore EACCES che richiede di eseguire nuovamente il comando come root / amministratore. È un problema di autorizzazioni.

È facile da risolvere , apri il tuo terminale (Applicazioni> Utilità> Terminale)

sudo chown -R $USER /usr/local/lib/node_modules

** Ti consiglio vivamente di non usare la gestione dei pacchetti con sudo (sudo npm -g install qualcosa), perché potresti riscontrare qualche problema in seguito **

Riferimento: http://foohack.com/2010/08/intro-to-npm/


Sìì! questo me l'ha fatto! dopo aver fatto gli altri altri quelli sopra: sudo chown -R `whoami` ~/.npm, sudo chown -R `whoami` /usr/local/libe
Regis Zaleman

8
Ciò può causare problemi di autorizzazione con molte altre app, quindi suggerirei di non farlo. Perché scambiare una lattina di vermi con un'altra?
Brad Parks,

1
O almeno raffinalo in / usr / local / lib / node_modules.
Ken,

Questo, questo e molto altro ancora. Dopo aver sbattuto la testa contro un muro, questo ha funzionato. +1
dashard,

Questo era il mio problema. Su un nuovo macbook (os x 10.10.3), le autorizzazioni su / usr / local / lib / node_modules erano: $ ll / usr / local / lib / node_modules totali 0 drwxr-xr-x 3 24561 ruota 102B 31 marzo 18:19 . drwxrwxr-x 4 24561 admin 136B 31 mar 18:19 .. drwxr-xr-x 26 65534 staff 884B 13 apr 10:53 npm
tkane2000

5

Per Mac (adottato dalla risposta di Christoper Will)

Mac OS X 10.9.4

  1. Preferenze di Sistema> Utenti e gruppi> (sblocco)> premi +:

    Nuovo account>
    Nome account "Gruppo" : nodegrp

    Dopo aver creato il gruppo, selezionare l'utente da includere in questo gruppo

  2. sudo chgrp -R nodegrp / usr / local / lib / node_modules /
    sudo chgrp nodegrp / usr / bin / node
    sudo chgrp nodegrp / usr / bin / npm
    sudo chown -R $ (whoami): nodegrp ~ / .npm


1
Ho dovuto cambiare un paio di percorsi in / usr / local / bin ma a parte questo, questa soluzione ha funzionato alla grande sulla mia macchina OX X 10.9 - grazie!
splig,

Cattiva pratica per cambiare la proprietà delle directory di sistema.
ricco remer il

@richremer Penso che dipenda da cosa stai cercando di ottenere. se la cartella è inizialmente accessibile solo dal sudoer, può essere modificata solo in questo modo. limitiamo la modifica alla cartella relativa a npm. Sarebbe più sicuro continuare a fare sudoo cambiare la proprietà di quel gruppo di cartelle in modo che possa essere modificato dall'utente normale? Se l'utente normale non dovrebbe eseguire alcuna azione su questa cartella, ovviamente non dovrebbe cambiare la proprietà del gruppo della cartella.
Ken,

La cosa appropriata da fare è installare i pacchetti globali con sudo, ma farlo con il -Hflag. Specificamente, sudo -H npm install -g <pkg>. Ciò garantisce una corretta definizione delle autorizzazioni per le cartelle di sistema e utente. Quello che non vuoi fare è usare sudo npm install -g, perché questo installa i file di proprietà di root nella tua directory utente. Sarebbe bello se npm fosse abbastanza intelligente da farlo nel modo giusto, ma non lo è, quindi devi usare il -Hflag sudo per installare correttamente a livello globale.
ricco ricordo

4

Nel mio caso, è a causa del permesso di ~ / tmp, quindi faccio:

sudo chown -R $USER ~/tmp

Ed è OK!


4

Per me, esegui solo

sudo chown -R $(whoami) ~/.npm

non funziona Quindi eseguo anche io

sudo chown -R $(whoami) /usr/lib/node_modules/
sudo chown -R $(whoami) /usr/bin/node
sudo chown -R $(whoami) /usr/bin/npm

E tutto funziona bene!


Sei un signore fantastico :)
user805981

I file in /usr/libsono file di sistema e non devono essere di proprietà del tuo account utente personale.
rich remer

4

PROBLEMA : tu (l'utente) non disponi del giusto set di autorizzazioni per la directory.

La via d'uscita istantanea è eseguire l'installazione di npm usando sudo, ma ciò può dare lo stesso errore o un'installazione errata.

E cambiare la proprietà della directory non è una buona opzione, una patch temporanea.


Soluzione / Suggerimento : modifica la directory predefinita di npm (dai documenti ufficiali )

Eseguire il backup del computer prima di andare avanti.

(facoltativo) In caso di installazione errata, disinstallarlo innanzitutto:

npm uninstall <package-name>  # use sudo if you used it while installation
npm cache verify  # or, npm cache clean for npm version below 5.x.x 
  1. Crea una directory per installazioni globali:

    mkdir ~/.npm-global

  2. Configurare npm per utilizzare il nuovo percorso della directory:

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

  3. Apri o crea un file ~/.profileo ~/.bash_profilee aggiungi questa riga:

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

  4. Torna alla riga di comando, aggiorna le variabili di sistema o riavvia il terminale:

    source ~/.profile

  5. (opzionale) Test: scarica un pacchetto a livello globale senza usare sudo.

    npm install -g jshint


3

Nel caso in cui sudo chown -R $(whoami) ~/.npmnon funzionasse per te o hai bisogno di una soluzione di comando non terminale.

Il problema è che il tuo account utente non ha i permessi di scrittura nella cartella node_modules, quindi puoi fare quanto segue

  1. Apri finder e premi cmd+ shift+ gquesto si aprirà vai alla cartella con url

  2. Scrivi il seguente percorso /usr/local/lib/node_modulese premi go

  3. Fare clic con il tasto destro sulla node_modulescartella e scegliereGet Info

  4. Scorri verso il basso fino alla sharing & permissionssezione

  5. Sblocca per poter apportare modifiche.

  6. Premi +e aggiungi il tuo account utente

  7. Assicurati di scegliere Read & Writenel menu a discesa dei privilegi

Ora dovresti essere in grado di installare i pacchetti senza sudoe i problemi di autorizzazione dovrebbero essere risolti


3

Problema: non si dispone dell'autorizzazione per scrivere nelle directory utilizzate da npm per archiviare pacchetti e comandi globali.

Soluzione: consentire l'autorizzazione per npm.

Apri un terminale:

comando + barra spaziatrice quindi digitare 'terminale'

Inserisci questo comando:

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
  • Nota: questo richiederà la tua password.

Questa soluzione consente l'autorizzazione SOLO alle directory necessarie, mantenendo le altre directory piacevoli e sicure.


Downvoting perché l'impostazione della proprietà dell'utente delle cartelle di sistema è un anti-pattern e questo non tiene conto di ciò. Nel caso speciale che npm config get prefixrestituisce qualcosa nella cartella home, questa soluzione risolverà le autorizzazioni, ma non risolve il problema di base dell'installazione di pacchetti globali in modo sicuro per un ambiente condiviso.
ricco remer il

Ciò riscriverà i permessi di gran parte del sistema operativo. L'esecuzione in Ubuntu, ad esempio, renderà il comando "sudo" stesso inutilizzabile.
Sahand Seifi

2

Un'altra grande correzione qui per configurare correttamente NPM, eseguire i seguenti comandi:

npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH

2

potresti provare questo, funziona su Ubuntu e Mac

sudo chown -R $(whoami) /usr/local/lib/node_modules

1
Ho eseguito questo e ho lavorato al 100% per me su un mac: sudo chown -R $ (whoami) / usr / local / lib / node_modules
leeroya

1

Quello che a me sembra l'opzione migliore è quello suggerito nella documentazione di npm , che è prima di controllare dove i nodi_moduli globali sono installati di default eseguendo npm config get prefix. Se ottieni, come faccio con Trusty,/usr potresti volerlo cambiare in una cartella che puoi tranquillamente possedere senza rovinare le cose come ho fatto io.

Per fare ciò, scegli o crea una nuova cartella nel tuo sistema. Potresti averlo nella tua home directory o, come me, sotto /usr/localper coerenza perché sono anche un utente Mac (preferisco non aver bisogno di guardare in luoghi diversi a seconda della macchina in cui mi trovo di fronte). Un altro buon motivo per farlo è il fatto che /usr/localprobabilmente la cartella è già nel tuo PERCORSO (a meno che non ti piaccia scherzare con il PERCORSO) ma è probabile che la tua cartella appena creata non lo sia e che dovresti aggiungerla al PERCORSO sul tuo profilo .bash o .bashrc .

Per farla breve, ho modificato il percorso predefinito dei moduli globali con npm config set prefix '/usr/local', creato la cartella /usr/local/lib/node_modules(che verrà utilizzata da npm) e modificato le autorizzazioni per le cartelle utilizzate da npm con il comando:

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

Ora puoi installare qualsiasi modulo a livello globale in sicurezza. Spero che sia di aiuto!


1

Ecco come ho risolto il problema su Windows 8.1:

  • Vai all'installazione di nodejs (di solito C: \ Programmi \ nodejs)
  • Fare clic con il pulsante destro del mouse sulla cartella node_modules e passare a proprietà
  • Fai clic sulla scheda Sicurezza e avanzate
  • Nella parte superiore vedrai "Proprietario: SISTEMA", fai clic su cambia
  • Immettere l'utente per il quale si desidera disporre delle autorizzazioni e fare clic su OK
  • Seleziona la casella in fondo alle impostazioni avanzate "Sostituisci tutte le voci di autorizzazione degli oggetti figlio con voci di autorizzazione ereditabili da questo oggetto" e fai clic su OK
  • Fai qualsiasi npm install / update di cui hai bisogno

1

La soluzione migliore sarebbe questa fornita dalla documentazione di npm.


Per Ubuntu la soluzione suggerita è l' opzione n. 2

Brevi passaggi:
creare una directory per installazioni globali:
mkdir ~/.npm-global

Configura npm per utilizzare il nuovo percorso della directory: può aiutarti a verificare se il prefisso è stato aggiornato o meno. Il risultato sarebbe <La tua home directory> /. Npm-global
npm config set prefix '~/.npm-global'
npm config get prefix

Apri o crea un file ~ / .profile e aggiungi questa riga:
export PATH=~/.npm-global/bin:$PATH

Tornando alla riga di comando, aggiorna le variabili di sistema:
source ~/.profile

Invece dei passaggi 2-4 puoi anche usare la corrispondente variabile ENV (es. Se non vuoi modificare ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global


Per Mac la soluzione suggerita è l' opzione n. 3

Su Mac OS puoi evitare del tutto questo problema usando il gestore di pacchetti Homebrew

brew install node


Questo NPM_CONFIG_PREFIX non funzionerà. Questo è un errore nel descrittore npm. Vedere il mio post di cui sopra, come farlo nel modo giusto: stackoverflow.com/a/41395398/1256697
Suther

1

Lo risolvo cambiando il proprietario da root al mio nome utente

sudo chown -R me:me /home/me/.config/configstore/

cambiarmi con il tuo nome utente e gruppo.


1

Mi piace usare i gruppi Ubuntu per raggiungere questo obiettivo invece di cambiare proprietario. È abbastanza semplice.

  1. Prima installa nodejs e npm usando apt-get

    sudo apt-get update && sudo apt-get install nodejs npm

  2. Scopri chi ha effettuato l'accesso, ad esempio nome utente, esegui il comando seguente per vederlo nel terminale

    whoami

  3. Puoi vedere l'elenco dei gruppi che ti sono stati assegnati usando un comando molto semplice, normalmente il primo gruppo è il tuo stesso nome utente

    groups

  4. Eseguire quanto segue per consentire l'accesso all'utente che ha effettuato l'accesso

    sudo chmod 777 -R /usr/local && sudo chgrp $(whoami) -R /usr/local

  5. Aggiorna npm e nodejs

    npm install -g npm

Sei pronto, il tuo utente può eseguire comandi npm senza sudo

Puoi anche fare riferimento a questo link https://askubuntu.com/a/1115373/687804


0

In Mac OS X, quando si installa con Homebrew di brew install npm , il percorso di installazione è /usr/local/share/npm/con entrambi bin/e lib/node_modules/sottocartelle.

L'esecuzione di questo comando per passare al proprietario per l'utente attualmente connesso dovrebbe risolvere tutto e consentire l'installazione di pacchetti NPM globali senza sudo.

sudo chown -R $USER ~/.npm /usr/local/share/npm/


1
Oggi consiglierei l'altra mia risposta a questa domanda che usa npm configinvece.
Joel Purra,

0

In realtà, avevo anche lo stesso problema. Stavo eseguendo Ubuntu. Il mio problema sorge perché avevo perso la mia chiave pubblica di Ubuntu. Anche l'aggiornamento del mio sistema non stava avvenendo. Stava dando errore GPG. In tal caso, puoi recuperare la chiave usando questo comando:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <key in GPG error>

Dopo di che npm funziona bene!


0

John Papa indica la storia e il ragionamento alla base di questo problema e fornisce una soluzione solida :

I passi di John Papa sono:

  1. Utilizzare brew per installare il nodo senza npm
  2. Aggiorna il tuo .bash_profile / .bashrc per far sapere a npm e al nodo dove installare e trovare i pacchetti
  3. Utilizzare brew per aggiornare node e npm per aggiornarsi

Spero che questo aiuti i curiosi!


0

Questa è la soluzione che ho utilizzato e lavorato. Ho provato ad utilizzare whoaminon ha mai funzionato.

sudo chown -R $USER /usr/local/lib/node_modules

poi

sudo chown -R $USER /usr/local/bin/npm

poi

sudo chown -R $USER /usr/local/bin/node


0

La risposta di @Yves M. è stata molto simile alla mia soluzione. Ecco i comandi che ho usato, che erano leggermente diversi dai suoi.

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

Quindi eseguire una query per l'ultima versione:

nvm ls-remote

Quindi installare la versione più recente:

nvm install YOUR_VERSION_HERE

esempio

nvm install v5.8.0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.