I moduli NPM non verranno installati a livello globale senza sudo


126

Ho appena reinstallato Ubuntu 12.04 LTS e prima di ogni altra cosa ho fatto questi passaggi :

  1. Nodo installato tramite Gestione pacchetti con il seguente script

    sudo apt-get update
    
    sudo apt-get install python-software-properties python g++ make
    
    sudo add-apt-repository ppa:chris-lea/node.js
    
    sudo apt-get update
    
    sudo apt-get install nodejs
  2. Ho cercato di installare yeoman, express, n, i generatori di yeoman a livello globale e tutti hanno restituito lo stesso errore

    npm ERR! Errore: EACCES, collegamento simbolico '../lib/node_modules/n/bin/n'

    npm ERR! {[Errore: EACCES, link simbolico '../lib/node_modules/n/bin/n'] errno: 3, codice: 'EACCES', percorso: '../lib/node_modules/n/bin/n'}

    npm ERR!

    npm ERR! Prova a eseguire nuovamente questo comando come root / amministratore.

    npm ERR! Sistema Linux 3.8.0-29-generico

    npm ERR! comando "/ usr / bin / node" "/ usr / bin / npm" "install" "-g" "-d" "n"

    npm ERR! cwd / home / heberlz

    npm ERR! nodo -v v0.10.20

    npm ERR! npm -v 1.3.11

    npm ERR! percorso ../lib/node_modules/n/bin/n

    npm ERR! codice EACCES

    npm ERR! errno 3

    npm ERR! stack stack: EACCES, symlink '../lib/node_modules/n/bin/n'

    npm ERR!

    npm ERR! Ulteriori dettagli sulla registrazione sono disponibili in:

    npm ERR! /home/heberlz/npm-debug.log

    npm ERR! non ok codice 0

  3. Proprietà reclamata ricorsivamente delle seguenti cartelle ~ / .npm, / usr / lib / node, / usr / lib / node_modules e dei seguenti symlink / usr / bin / node, / usr / bin / nodejs senza assolutamente successo

Devo installare yeoman e i suoi generatori senza sudo per non avere problemi in seguito :(


Grazie Phil, ora sembra molto meglio
HeberLZ,

2
Se vuoi che npm installi i pacchetti globali in $ HOME piuttosto che / usr, segui la guida github.com/sindresorhus/guides/blob/master/…
Colonnello Panic,

questo è ciò che ha funzionato per me github.com/nodejs/node-v0.x-archive/issues/… :ln -s /usr/bin/nodejs /usr/bin/node
Loïc MICHEL

Il possibile duplicato di npm genera un errore senza sudo
Louis,

Risposte:


318

Ubuntu 12.04 e l'utilizzo del PPA di Chris Lea per installare i seguenti lavori per me:

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

e aggiungendo $ HOME / .npm-pacchetti / bin a $ PATH

aggiungere a .bashrc

export PATH="$PATH:$HOME/.npm-packages/bin"

vedi https://stackoverflow.com/a/18277225 da @passy


9
Sembra una soluzione molto più pulita. Se non ti piacciono le cartelle di sistema nella tua home directory, puoi anche usare una posizione come ~ / .local / share / npm.
JeroenHoek,

Va notato che dopo aver modificato il prefisso, è necessario reinstallare tutti i moduli globali precedentemente installati, incluso npm stesso.
Dziamid,

Questo sembra a posto, ma ho trovato molto più facile dare il permesso all'utente di scrivere /usr/lib/node_modules/. O forse anche appropriato per creare un gruppo unix nodejs e dare a quel gruppo il permesso di scrivere in quella directory.
Mehulkar,

Un piccolo dettaglio da aggiungere è che devi creare tu stesso la directory ~ / npm. Altrimenti, npm uscirà con errori ENOENT.
Jason Farnsworth,

6
Perché questo non è il valore predefinito per npm? Grazie per la condivisione.
Dorian,

23

Se hai già $HOME/binnel tuo percorso, una soluzione più semplice è solo ...

npm config set prefix ~
  • I nuovi comandi del nodo verranno ora installati nella tua $HOME/bindirectory.
  • Non c'è bisogno di cambiare il tuo percorso!

Poiché questa discussione riguarda davvero la riduzione dei rischi per la sicurezza dell'esecuzione sudo, è necessario tenere presente che qualsiasi app nodo potrebbe potenzialmente installare un nome app che non corrisponde al nome del pacchetto nodo registrato che si pensa di installare. Quindi esiste un rischio per la sicurezza che npm installsostituirà un comando di sistema esistente o uno già presente $HOME/bin. Se sei preoccupato, controlla prima bine le scriptsproprietà nel package.jsonfile dell'app che stai installando.

In generale, è più sicuro:

  • (a) Posiziona l' $HOME/binultimo nel tuo percorso in modo che i comandi di sistema non vengano sostituiti.
  • (b) non includere "." o qualsiasi percorso relativo nel tuo in $PATHmodo da non eseguire accidentalmente un comando che si trova nella directory corrente.

Riferimento:


1
Un altro importante problema di sicurezza npmè che il codice sorgente che vedi su un github.comrepository per un pacchetto di nodi potrebbe non essere lo stesso codice che stai installando dal npm.orgserver del registro!
Tony O'Hagan,

Mentre in teoria un pacchetto di nodi ben predisposto si installerà felicemente in ~/bin, alcuni pacchetti di nodi (o i loro pacchetti dipendenti) sono stati testati solo durante l'installazione, sudoquindi tieni presente che potresti riscontrare un problema di "ambiente di installazione" non testato. Come ogni altro problema ambientale (come il cambiamento del sistema operativo), il principio di "scrivere una volta, testare ovunque" è ancora valido.
Tony O'Hagan,

Lo svantaggio di questo metodo è che npm crea una directory aggiuntiva, chiamata ~ / lib. A seconda delle pratiche dell'organizzazione, ciò potrebbe non essere desiderabile.
Mr. S

13

Per ottobre 2014:

Node.js è disponibile dal repository di distribuzioni binarie NodeSource Debian e Ubuntu .

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

Questo è tutto.

Risposta obsoleta:

Il modo più veloce senza usare sudo è come descritto qui da isaac

Ti incoraggio vivamente a non fare la gestione dei pacchetti con sudo! I pacchetti possono eseguire script arbitrari, il che rende sudo un comando del gestore pacchetti sicuro come un taglio di motosega. Certo, è veloce e sicuramente supererà tutti gli ostacoli, ma potresti davvero desiderare che quell'ostacolo rimanga lì.

Consiglio invece di farlo una volta:

sudo chown -R $USER /usr/local

MODIFICARE:

Vi sono alcuni problemi di sicurezza e limitazioni di funzionalità relative alla modifica della proprietà di / usr / local per l'utente corrente:

Detto questo, se si desidera installare il modulo globale senza usare sudo, non vedo alcuna soluzione migliore (dal punto di vista pragmatico) di quella menzionata. La sicurezza e la facilità d'uso sono argomenti molto ampi e non esiste una risposta facile a tale scopo: dipende solo dalle vostre esigenze.


23
Questa è una cattiva idea perché rende tutto / usr / local appartenente a un singolo utente.
Reed G. Law

4
Come ha sottolineato @ ReedG.Law, questa è davvero una cattiva idea. Non modificare la proprietà di / usr / local in nessun utente specifico.
Christopher Will,

3
Sono d'accordo con la legge di Reed G - cambiare / usr / local è un'idea BAD BAD BAD. Nel mio caso stavo guardando le indicazioni e l'ho fatto: poi ho ricordato che devo CONDIVIDERE questo con un'altra persona che sta sviluppando. Sono tornato e (si spera) ho avuto tutti i cambiamenti. Non è solo sicurezza, ma anche funzionalità.
Lloyd Sargent,

3
C'è qualche svantaggio di questa soluzione se c'è un solo utente sul sistema?
Connorbode

2
Siamo spiacenti, /usr/local/lib/node_modulesnode
volevo

11

Il problema era che avevo installato il nodo usando sudo , per evitare errori durante l'installazione dei moduli npm a livello globale, NON DEVI MAI installare il nodo con sudo.

La mia soluzione era reinstallare il nodo 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 -R $ USER / usr / local

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

Una cosa da notare è che il solo possesso della cartella / usr / local non funzionerebbe nel mio caso perché l'installazione del nodo è stata fatta con sudo

Ultimo passo per installare yeoman: # anche se su yeoman.io dice che facendo "npm install -g yo" si installa già bower e grunt, ci sono alcuni sottomoduli di grunt che falliscono, quindi l'ho risolto installandolo da solo

npm install -g bower

npm install -g grunt

npm installa -g yo

npm installa -g generatore-angolare


Fantastico in teoria, ma c'è un modo per ottenere lo stesso effetto senza essere costretto a costruire Node e installare 4 moduli aggiuntivi solo per avere accesso ai moduli a livello globale?
Dan Nissenbaum,

La risposta selezionata funziona esattamente come ti serve. Questo è quello che ho fatto 2 anni fa quando non esisteva ancora un'altra soluzione pubblica, ma ora è inutile
HeberLZ,

5

Ho risolto questo problema con la variabile di ambiente e l'alias della shell:

export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"

Per me npm non ha rispettato l'impostazione di configurazione "prefisso" in .npmrc.


2

Secondo questo post SO simile: npm genera un errore senza sudo

Sembra che potresti avere un problema di proprietà con la ~/.npmdirectory.

Come con la risposta in quella, prova:

sudo chown -R `whoami` ~/.npm

In realtà questo non ha funzionato come ho spiegato al passaggio 3 di ciò che ho provato quando non sono riuscito a farlo funzionare, il problema era che avevo installato il nodo usando sudo, che in alcune circostanze potrebbe creare problemi. Dopo aver eliminato il nodo e reinstallato dalle sue fonti, tutto ha iniziato a funzionare come previsto!
HeberLZ,

@HeberLZ Penso che tu abbia ragione, ho appena provato a farlo su un'altra macchina ieri sera e non funzionava. Ho avuto anche altri problemi di autorizzazione da affrontare. Non sono ancora sicuro di quale sia il modo migliore per non eseguire l'installazione di npm dal sorgente.
prasanthv,

Collegare alla domanda nei commenti o contrassegnare la domanda corrente come duplicata. Non aiuta a copiare e incollare le risposte da altre domande.
givanse

@HeberLZ il downvote di questa risposta è innapropiato in quanto si rivolge al titolo della domanda che hai posto.
Sebastian Sastre,

Non ricordo quando ho annullato la votazione della risposta, ma nel mio caso particolare ciò che hai scritto non ha risolto il problema, motivo per cui penso che probabilmente ho annullato la votazione della risposta. Come indicato sulla domanda: "Proprietà reclamata delle seguenti cartelle in modo ricorsivo ~ / .npm, / usr / lib / node, / usr / lib / node_modules e dei seguenti symlink / usr / bin / node, / usr / bin / nodejs senza successo "Ho provato a ottenere la proprietà di .npm e di tutte quelle altre cartelle senza successo
HeberLZ,

2

Trova il percorso della directory di npm:

npm config get prefix

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

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).

Ecco il link per tutti i dettagli

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


Vitale. Cerca di evitare di aggiungere bine sharetra parentesi. Ignorare può portare alla modifica della proprietà di queste cartelle per l'utente corrente e problemi con l'installazione di nuovi pacchetti nel sistema sudoperché anche la proprietà verrà cambiata
A.Ametov

questo encomio distrugge tutto il mio file system: (
UA_


1

In realtà, ho appena cambiato l'autorizzazione di una cartella utente di proprietà di root:

sudo chown -R $USER ~/.config/configstore

Quindi ho potuto "installare npm" e "installare bower" senza sudo! Ha funzionato bene!


0

usando lubuntu 14.04.3, ho provato a cambiare la proprietà del prefisso .npm e npm, ho aggiornato il mio percorso, npm ha installato i moduli nella mia home directory senza sudo ma il percorso era errato, quindi i moduli come ember non sono stati trovati, linuxbew ha risolto il problema, veloce guida alla configurazione qui per nodo / npm


0

Questo problema e altri causati dallo stesso motivo possono essere risolti installando Node nello spazio utente.

Puoi farlo semplicemente copiando e incollando nel tuo terminale

NODEJS_ROOT=${NODEJS_ROOT:-~/nodejs}
cd /tmp
wget -N http://nodejs.org/dist/node-latest.tar.gz && tar xzf node-latest.tar.gz
NODEJS_CURRENT=$(tar tf node-latest.tar.gz|head -1)
mkdir -p $NODEJS_ROOT/$NODEJS_CURRENT
cd $NODEJS_CURRENT
./configure --prefix=$NODEJS_ROOT/$NODEJS_CURRENT && make install
cd $NODEJS_ROOT
rm current 2> /dev/null # Removes current symbolic link, if any
ln -s $NODEJS_CURRENT current

Gli stessi comandi possono essere lanciati anche per ottenere Node aggiornato all'ultima versione.

Non dimenticare di modificare il tuo ambiente. Solo una volta, fallo

echo "export NODEJS_ROOT=$NODEJS_ROOT"            >> $HOME/.bash_profile
echo 'export PATH=$NODEJS_ROOT/current/bin:$PATH' >> $HOME/.bash_profile
source $HOME/.bash_profile # reload your env, so you can use node right now

Dai un'occhiata a questo articolo come riavvio su come installare Node.js senza sudo .

Per una soluzione più generale su questo argomento (ad esempio, installare il software localmente) consultare il software di punti .


0

basta usare nvm per passare in modo dinamico tra le diverse versioni del nodo ed è installato localmente per l'utente. Nessun sudo necessario. Assicurati solo di aver ripulito completamente il vecchio nodo in anticipo.

https://github.com/nvm-sh/nvm


-2

La migliore soluzione che ho trovato è stata installare Node.js dal pacchetto tar nella directory home dell'utente e collegare il percorso della cartella lib. Ecco cosa devi fare

Ciò installerà Nodejs in ~ / .local / invece che nel predefinito / usr / local /

Add this to your ~/.npmrc (create the file if it doesn't exist already):

root =    /home/YOUR-USERNAME/.local/lib/node_modules
binroot = /home/YOUR-USERNAME/.local/bin
manroot = /home/YOUR-USERNAME/.local/share/man
Download the Nodejs source code from nodejs.org and install it under your ~/.local tree:

tar xf node......
cd node........
./configure --prefix=~/.local
make
make install

Create ~/.node_modules symlink. (This directory will be automatically searched when you load modules using require "module" in scripts. I'm not sure why Node doesn't search ~/.local/lib/node_modules by default.)

cd
ln -s .local/lib/node_modules .node_modules
Is ~/.local/bin in your path? Type

which npm
If it says ~/.local/bin/npm, you're done.

Otherwise, do this...

export PATH=$HOME/.local/bin:$PATH
...and add that line to your ~/.profile file, so it'll run every time you log in.

Se si verificano ancora errori di proprietà o di autorizzazione durante l'installazione dei pacchetti, modificare la proprietà di ~ / .local / dir eseguendo

chown -R user:user ~/.local/

Ora dovresti essere bravo a installare i pacchetti tramite 'npm'

Nota: TUTTI I COMANDI SOPRA DEVONO ESSERE ESEGUITI COME UTENTE. NON UTILIZZARE SUDO O IL LOGIN DI RADICE

MAI MODIFICARE MAI LA PERMESSIONE DELLE CARTELLE SOTTO '/ USR / LIB /'. TERRERÀ SU SO INSTABILE



-2

Trovo le spiegazioni di Pawel Grzybek molto convincenti: si riducono a 3 semplici comandi sudo, non dovendo mai più usare sudo per installazioni npm globali:

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
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.