NPM-Module werden ohne sudo nicht global installiert


126

Ich habe gerade Ubuntu 12.04 LTS neu installiert und vor allem habe ich folgende Schritte ausgeführt :

  1. Installierter Knoten über den Paketmanager mit dem folgenden Skript

    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. Es wurde versucht, die Generatoren von yeoman, express, n, yeoman global zu installieren, und alle haben den gleichen Fehler zurückgegeben

    npm ERR! Fehler: EACCES, Symlink '../lib/node_modules/n/bin/n'

    npm ERR! {[Fehler: EACCES, Symlink '../lib/node_modules/n/bin/n'] Fehler: 3, Code: 'EACCES', Pfad: '../lib/node_modules/n/bin/n'}

    npm ERR!

    npm ERR! Bitte versuchen Sie erneut, diesen Befehl als root / Administrator auszuführen.

    npm ERR! System Linux 3.8.0-29-generic

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

    npm ERR! cwd / home / heberlz

    npm ERR! Knoten -v v0.10.20

    npm ERR! npm -v 1.3.11

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

    npm ERR! Code EACCES

    npm ERR! errno 3

    npm ERR! Stapelfehler: EACCES, Symlink '../lib/node_modules/n/bin/n'

    npm ERR!

    npm ERR! Weitere Protokollierungsdetails finden Sie in:

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

    npm ERR! nicht ok Code 0

  3. Zurückgewonnener Besitz der folgenden Ordner rekursiv ~ / .npm, / usr / lib / node, / usr / lib / node_modules und der folgenden Symlinks / usr / bin / node, / usr / bin / nodejs ohne Erfolg

Ich muss yeoman und seine Generatoren ohne sudo installieren, um später keine Probleme zu haben :(


Danke Phil, jetzt sieht es viel besser aus
HeberLZ

2
Wenn Sie möchten, dass npm globale Pakete in $ HOME anstelle von / usr installiert, folgen Sie der Anleitung github.com/sindresorhus/guides/blob/master/…
Colonel Panic

Das hat bei mir funktioniert. github.com/nodejs/node-v0.x-archive/issues/… :ln -s /usr/bin/nodejs /usr/bin/node
Loïc MICHEL

Mögliches Duplikat von npm wirft Fehler ohne sudo
Louis

Antworten:


318

Ubuntu 12.04 und die Verwendung von Chris Leas PPA zur Installation der folgenden Funktionen funktionieren für mich:

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

und Hinzufügen von $ HOME / .npm-packages / bin zu $ ​​PATH

Anhängen .bashrc

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

Siehe https://stackoverflow.com/a/18277225 von @passy


9
Dies sieht nach einer viel saubereren Lösung aus. Wenn Sie Systemordner in Ihrem Home-Verzeichnis nicht mögen, können Sie auch einen Speicherort wie ~ / .local / share / npm verwenden.
JeroenHoek

Es ist zu beachten, dass Sie nach dem Ändern des Präfixes alle zuvor installierten globalen Module, einschließlich npm selbst, neu installieren sollten.
Dziamid

Dies scheint in Ordnung zu sein, aber ich fand es viel einfacher, dem Benutzer die Erlaubnis zum Schreiben zu erteilen /usr/lib/node_modules/. Oder vielleicht sogar geeignet, eine Nodejs-Unix-Gruppe zu erstellen und dieser Gruppe die Berechtigung zum Schreiben in dieses Verzeichnis zu erteilen.
Mehulkar

Ein kleines Detail hinzuzufügen ist , dass Sie machen das ~ / npm Verzeichnis selbst. Andernfalls wird npm mit einem ENOENT-Fehler beendet.
Jason Farnsworth

6
Warum ist dies nicht die Standardeinstellung für npm? Danke für das Teilen.
Dorian

23

Wenn Sie bereits $HOME/binauf Ihrem Weg sind, ist eine einfachere Lösung nur ...

npm config set prefix ~
  • Neue Knotenbefehle werden jetzt in Ihrem $HOME/binVerzeichnis installiert .
  • Sie müssen Ihren Weg nicht ändern!

Da geht es bei dieser Diskussion wirklich darum, die Sicherheitsrisiken beim Laufen zu reduzieren sudo , sollten Sie sich auch darüber im Klaren sein, dass jede Knoten-App möglicherweise einen App-Namen installiert, der nicht mit dem Namen des registrierten Knotenpakets übereinstimmt, von dem Sie glauben, dass Sie ihn installieren. Es besteht also das Sicherheitsrisiko, dass ein npm installvorhandener oder bereits vorhandener Systembefehl ersetzt wird $HOME/bin. Wenn Sie betroffen sind, überprüfen Sie die binund scriptsEigenschaften in der package.jsonDatei der App, die Sie zuerst installieren.

Im Allgemeinen ist es am sichersten:

  • (a) Platzieren Sie den $HOME/binletzten Platz in Ihrem Pfad, damit Systembefehle nicht ersetzt werden.
  • (b) "." oder einen relativen Pfad in Ihrem, $PATHdamit Sie nicht versehentlich einen Befehl ausführen, der sich zufällig im aktuellen Verzeichnis befindet.

Referenz:


1
Ein weiteres wichtiges Sicherheitsproblem npmbesteht darin, dass der Quellcode, den Sie auf einem github.comRepo für ein Knotenpaket sehen, möglicherweise nicht mit dem Code übereinstimmt, den Sie vom npm.orgRegistrierungsserver installieren !
Tony O'Hagan

Während theoretisch ein gut gestaltetes Knotenpaket problemlos installiert werden kann ~/bin, wurden einige Knotenpakete (oder deren abhängige Pakete) nur als Installation getestet. Beachten Sie sudodaher, dass möglicherweise ein ungetestetes Problem mit der "Installationsumgebung" auftritt. Wie bei jedem anderen Umgebungsproblem (wie dem Wechsel des Betriebssystems) gilt das Prinzip "einmal schreiben, überall testen" immer noch.
Tony O'Hagan

Der Nachteil dieser Methode ist, dass npm ein zusätzliches Verzeichnis mit dem Namen ~ / lib erstellt. Abhängig von Ihren Organisationspraktiken ist dies möglicherweise nicht wünschenswert.
Herr S

13

Stand Oktober 2014:

Node.js ist im Repository für Binärdistributionen von NodeSource Debian und Ubuntu verfügbar .

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

Das ist es.

Veraltete Antwort:

Der schnellste Weg ohne sudo ist wie hier von isaac beschrieben

Ich empfehle Ihnen dringend, keine Paketverwaltung mit sudo durchzuführen! Pakete können beliebige Skripte ausführen, wodurch das Sudoing eines Paketmanagerbefehls so sicher ist wie ein Kettensägen-Haarschnitt. Sicher, es ist schnell und wird definitiv alle Hindernisse überwinden, aber vielleicht möchten Sie tatsächlich, dass dieses Hindernis dort bleibt.

Ich empfehle dies stattdessen einmal zu tun:

sudo chown -R $USER /usr/local

BEARBEITEN:

Es gibt bestimmte Sicherheitsbedenken und Funktionseinschränkungen hinsichtlich der Änderung des Eigentums von / usr / local auf den aktuellen Benutzer:

Wenn Sie jedoch ein globales Modul ohne Verwendung von sudo installieren möchten, sehe ich keine bessere Lösung (aus pragmatischer Sicht) als erwähnt. Sicherheit versus Benutzerfreundlichkeit ist ein sehr weit gefasstes Thema, und darauf gibt es keine einfache Antwort - es hängt nur von Ihren Anforderungen ab.


23
Dies ist eine schlechte Idee, da dadurch / usr / local zu einem einzelnen Benutzer gehört.
Reed G. Law

4
Wie @ ReedG.Law betonte, ist dies wirklich eine schlechte Idee. Ändern Sie den Besitz von / usr / local nicht auf einen bestimmten Benutzer.
Christopher Will

3
Ich muss Reed G Law zustimmen - das Ändern von / usr / local ist eine schlechte, schlechte, schlechte Idee. In meinem Fall habe ich nach Anweisungen gesucht und dies getan: Dann habe ich daran erinnert, dass ich dies mit einer anderen Person teilen muss, die die Entwicklung durchführt. Ich ging zurück und bekam (hoffentlich) alle Änderungen. Es geht nicht nur um Sicherheit, sondern auch um Funktionalität.
Lloyd Sargent

3
Gibt es einen Nachteil dieser Lösung, wenn nur ein Benutzer im System vorhanden ist?
Connorbode

2
Sorry, gemeint /usr/local/lib/node_modulesundnode
Creynders

11

Das Problem war, dass ich den Knoten mit sudo installiert habe , um Fehler bei der globalen Installation von npm-Modulen zu vermeiden. Ein Knoten darf NIEMALS mit sudo installiert werden.

Meine Lösung bestand darin, den Knoten neu zu installieren :

Laden Sie die neuesten stabilen Knotenquellen von nodejs.org # in meinem Fall node-v0.10.20.tar.gz herunter

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

cd node-v0.10.20 # unkomprimierten Ordner eingeben

sudo chown -R $ USER / usr / local

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

Zu beachten ist, dass in meinem Fall nur die Übernahme des Ordners / usr / local nicht funktioniert, da die Knoteninstallation selbst mit sudo durchgeführt wurde

Letzter Schritt, um yeoman zu installieren: # Obwohl auf yeoman.io steht, dass bei "npm install -g yo" bereits Laube und Grunzen installiert sind, gibt es einige Submodule von Grunzen, die fehlschlagen. Deshalb habe ich das behoben, indem ich es selbst installiert habe

npm install -g Laube

npm install -g grunzen

npm install -g yo

npm install -g generator-eckig


Theoretisch großartig, aber gibt es eine Möglichkeit, den gleichen Effekt zu erzielen, ohne gezwungen zu sein, Node zu erstellen und 4 zusätzliche Module zu installieren, um global auf Module zugreifen zu können?
Dan Nissenbaum

Die ausgewählte Antwort funktioniert genau so, wie Sie es benötigen. Dies ist, was ich vor 2 Jahren getan habe, als es noch keine andere öffentliche Lösung gab, aber jetzt ist es nutzlos
HeberLZ

5

Ich habe dieses Problem mit Umgebungsvariablen und Shell-Alias ​​gelöst:

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

Für mich hat npm die Konfigurationseinstellung "Präfix" in .npmrc nicht berücksichtigt.


2

Nach diesem ähnlichen SO-Beitrag: npm wirft Fehler ohne Sudo

Sieht so aus, als hätten Sie möglicherweise ein Besitzproblem mit dem ~/.npmVerzeichnis.

Versuchen Sie wie bei der Antwort in diesem:

sudo chown -R `whoami` ~/.npm

Eigentlich funktionierte dies nicht, wie ich in Schritt 3 erklärt habe, als ich es nicht zum Laufen bringen konnte. Das Problem war, dass ich den Knoten mit sudo installiert hatte, was unter bestimmten Umständen Probleme bereiten kann. Nachdem ich den Knoten gelöscht und von seinen Quellen neu installiert hatte, begann alles wie erwartet zu funktionieren!
HeberLZ

@HeberLZ Ich denke du hast recht, ich habe es gestern Abend auf einem anderen Computer versucht und es hat nicht funktioniert. Ich hatte auch andere Erlaubnisprobleme zu lösen. Ich bin mir immer noch nicht sicher, was der beste Weg ist, um diese Installation von npm nicht von der Quelle aus zu starten.
Prasanthv

Verknüpfen Sie die Frage in den Kommentaren oder markieren Sie die aktuelle Frage als Duplikat. Es hilft nicht, Antworten aus anderen Fragen zu kopieren und einzufügen.
Givanse

@HeberLZ Die Ablehnung dieser Antwort ist unangemessen, da sie den Titel der von Ihnen gestellten Frage anspricht.
Sebastian Sastre

Ich erinnere mich nicht, wann ich die Antwort abgelehnt habe, aber in meinem speziellen Fall hat das, was Sie geschrieben haben, das Problem nicht behoben, weshalb ich denke, dass ich die Antwort wahrscheinlich abgelehnt habe. Wie auf der Frage angegeben: "Zurückgewonnener Besitz der folgenden Ordner rekursiv ~ / .npm, / usr / lib / node, / usr / lib / node_modules und der folgenden Symlinks / usr / bin / node, / usr / bin / nodejs ohne Erfolg "Ich habe erfolglos versucht, den Besitz von .npm und all diesen anderen Ordnern zu erlangen
HeberLZ

2

Suchen Sie den Pfad zum Verzeichnis von npm:

npm config get prefix

Für viele Systeme ist dies / usr / local.

Ändern Sie den Eigentümer der Verzeichnisse von npm in den Namen des aktuellen Benutzers (Ihren Benutzernamen!):

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

Dadurch werden die Berechtigungen der von npm und einigen anderen Tools (lib / node_modules, bin und share) verwendeten Unterordner geändert.

Hier ist der Link für alle Details

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


Vital. Vermeiden Sie das Hinzufügen binund sharein Klammern. Das Ignorieren kann dazu führen, dass der Besitz dieser Ordner auf den aktuellen Benutzer sudogeändert wird und Probleme bei der Installation neuer Pakete auf dem System auftreten, da auch der Besitz geändert wird
A.Ametov,

Dieses Lob zerstört mein gesamtes Dateisystem: (
UA_


1

Eigentlich habe ich gerade die Berechtigung eines Benutzerordners geändert, der root gehört:

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

Dann könnte ich "npm install" und "bower install" ohne sudo! Hat gut funktioniert!


0

Mit lubuntu 14.04.3 habe ich versucht, den Besitz des Präfixes .npm und npm zu ändern, meinen Pfad aktualisiert, npm Module ohne sudo in mein Home-Verzeichnis installiert, aber der Pfad war falsch, sodass Module wie ember nicht gefunden wurden. linuxbew hat das Problem schnell gelöst Setup-Anleitung hier für Node / Npm


0

Dieses und andere Probleme, die aus demselben Grund verursacht wurden, können behoben werden, indem Node im Benutzerbereich installiert wird.

Sie können dies einfach durch Kopieren und Einfügen in Ihr Terminal tun

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

Dieselben Befehle können auch gestartet werden, um Node auf die neueste Version zu aktualisieren.

Vergessen Sie nicht, Ihre Umgebung zu bearbeiten. Nur einmal

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

In diesem Artikel erfahren Sie, wie Sie Node.js ohne sudo installieren .

Eine allgemeinere Lösung zu diesem Thema (dh Software lokal installieren) finden Sie unter Dotsoftware .


0

Verwenden Sie einfach nvm. Sie können dynamisch zwischen verschiedenen Knotenversionen wechseln und es wird lokal für Ihren Benutzer installiert. Kein Sudo nötig. Stellen Sie einfach sicher, dass Sie den alten Knoten zuvor vollständig bereinigt haben.

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


-2

Die beste Lösung, die ich gefunden habe, war, Node.js vom tar-Paket in das Home-Verzeichnis des Benutzers zu installieren und den Speicherort des lib-Ordners zu verknüpfen. Hier ist was Sie tun müssen

Dadurch werden Nodejs unter ~ / .local / anstelle des Standardwerts / usr / local / installiert.

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.

Wenn bei der Installation von Paketen immer noch ein Besitz- oder Berechtigungsfehler auftritt, ändern Sie den Besitz von ~ / .local / dir durch Ausführen

chown -R user:user ~/.local/

Jetzt sollten Sie gut darin sein, Pakete über 'npm' zu installieren.

Hinweis: ALLE OBEN GENANNTEN BEFEHLE SIND ALS BENUTZER AUSZUFÜHREN. VERWENDEN SIE KEIN SUDO- ODER ROOT-LOGIN

NIEMALS DIE ERLAUBNIS VON ORDNERN UNTER '/ USR / LIB /' ÄNDERN. FÜHRT ZU UNSTABILEM Betriebssystem



-2

Ich finde die Erklärungen von Pawel Grzybek sehr überzeugend: Sie beschränken sich auf drei einfache sudo-Befehle und müssen sudo nie wieder für globale npm-Installationen verwenden:

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.