npm wirft Fehler ohne sudo


1286

Ich habe gerade node und npm über das Paket auf nodejs.org installiert und jedes Mal, wenn ich versuche, etwas mit npm zu suchen oder zu installieren, wird der folgende Fehler ausgegeben, es sei denn, ich sudo den Befehl. Ich habe das Gefühl, dass dies ein Berechtigungsproblem ist. Ich bin schon der admin.

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
Bitte betrachten Sie die Lösung mit NVM : stackoverflow.com/a/24404451/1480391 (anstatt mit Berechtigungen zu hacken)
Yves M.

2
@janaspage Sie können Node oder NVM (Node Version Manager) nicht über NPM (Node Package Manager) installieren , dies ist nicht sinnvoll. NPM befindet sich innerhalb des Knotens (es wird gleichzeitig installiert). Werfen Sie einen Blick auf die Wikipedia-Seite: en.wikipedia.org/wiki/Npm_(software)
Yves M.

5
Endlich eine bessere Lösung als sudo chown: github.com/sindresorhus/guides/blob/master/…
Dmitri Zaitsev

Unter OSX und der Installation des Knotens mit dem 0official pkg intaller funktionierte diese Lösung nicht. Ich habe stattdessen dieses verwendet: stackoverflow.com/a/34968008/675565
fmquaglia

2
Es erklärt das Problem und das Update
n00b

Antworten:


2268

Dies scheint ein Berechtigungsproblem in Ihrem Home-Verzeichnis zu sein. Führen Sie Folgendes aus , um den Besitz des .npm- Verzeichnisses zurückzugewinnen:

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

102
Ich dachte, whoamidas wäre ein Platzhalter, aber es funktioniert so, wie es ist, also muss es eine Variable sein, die ich nicht verstehe.
Einfach

127
whoami ist ein tatsächlicher Shell-Befehl en.wikipedia.org/wiki/Whoami . Die Backticks stellen whoamisicher, dass es korrekt ausgeführt und dann in den Chown-Befehl gestellt wird
Noah

13
Sie können Ihren Benutzernamen auch manuell angeben. Wenn Ihr Benutzername "simpleascouldbe" ist, wäre der Befehlsudo chown -R simpleascouldbe ~/.npm
Noah

13
npm erfordert oder sollte nicht sudo verwenden - siehe Antwort unten @HeberLZ insbesondere seine 2. Option in Bezug auf: ./configure --prefix = xxxxxx
Scott Stensland

9
@ChristopherWill: Dies ändert nicht den Besitz eines Systemverzeichnisses. Dies ändert sich das Eigentum an Verzeichnisse im Home - Verzeichnis des Benutzers, der sollte dem Benutzer gehört werden.
user4815162342

619

Berechtigungen verwendet , um Sie bei der Installation von Knoten erforderlich sein , wenn die Dinge zu tun , wie in Ihrem Schreiben npm Verzeichnis ( npm link, npm install -gusw.).

Sie haben wahrscheinlich die Knoteninstallation mit Root-Berechtigungen ausgeführt. Aus diesem Grund werden Sie bei der globalen Paketinstallation aufgefordert, Root zu sein.


Lösung 1: NVM

Hacken Sie nicht mit Berechtigungen, sondern installieren Sie den Knoten richtig.

Auf einer Entwicklungsmaschine, sollten Sie nicht installieren und Knoten mit Root - Rechten laufen, sonst Dinge wie npm link, npm install -gwerden die gleichen Berechtigungen benötigen.

Mit NVM (Node Version Manager) können Sie Node ohne Root-Berechtigungen installieren und viele Node-Versionen installieren, um problemlos damit zu spielen. Perfekt für die Entwicklung.

  1. Deinstallieren Sie Node (Root-Berechtigung ist wahrscheinlich erforderlich). Dies könnte Ihnen helfen.
  2. Installieren Sie dann NVM gemäß den Anweisungen auf dieser Seite .
  3. Installieren Sie Node über NVM: nvm install node

Nun npm link, npm install -gnicht mehr benötigen Sie root zu sein.

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


Lösung 2: Installieren Sie Pakete global für einen bestimmten Benutzer

Hacken Sie nicht mit Berechtigungen, installieren Sie npm-Pakete global richtig.

Wenn Sie unter OSX oder Linux arbeiten, können Sie ein benutzerdefiniertes Verzeichnis für Ihr globales Paket und Setup erstellennpm und nodeerfahren, wie Sie global installierte Pakete finden.

In diesem großartigen Artikel finden Sie schrittweise Anleitungen zur globalen Installation von npm-Modulen ohne sudo.

Siehe auch: npm-Dokumentation zum Korrigieren von npm-Berechtigungen .


32
Von allen hier veröffentlichten Lösungen lieferte die hier veröffentlichte NVM-Lösung die besten Ergebnisse für mich. Es wird dringend empfohlen, NVM zu verwenden, anstatt mit Berechtigungen zu spielen.
Wenincode

9
Diese Anleitung hat sehr gut funktioniert. Allerdings möchten Sie wahrscheinlich die Module entfernen, die Sie mit sudo installiert haben, bevor Sie nodejs deinstallieren : npm ls -gp | awk -F/ '/node_modules/ && !/node_modules.*node_modules/ {print $NF}' | xargs npm -g rm- Ich musste nodejs und in einer Root-Shell neu installieren und deinstallieren, sonst haben Sie weiterhin Symlinks zu yo, grunt, etc…
Bruno Flávio

4
Dies ist die beste Lösung. Ich habe alle Module entfernt, indem sudo npm list -g --depth=0. | awk -F ' ' '{print $2}' | awk -F '@' '{print $1}' | sudo xargs npm remove -g ich zuerst stackoverflow.com/a/22290968/1449157 ausgeführt und sie dann entfernt npmund installiert habenvm
Fabio Antunes

3
Für Deinstallationsanweisungen für den Knoten verwenden Sie diese SO-Antwort stackoverflow.com/a/11178106/480031
seangates

3
Warum ist es in Ordnung, root zu verwenden, um den Knoten auf einer Produktionsmaschine zu installieren?
Bruno Peres

401

Außerdem benötigen Sie die Schreibberechtigung im node_modulesVerzeichnis:

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

7
Sowie das ~/tmpVerzeichnis für mich.
bekannt als

122
Ich weiß nicht, warum dies immer noch positive Stimmen bekommt. Es ist eine sehr schlechte Praxis, den Besitz von Systemverzeichnissen auf einen bestimmten Benutzer zu ändern! Weitere Lösungen finden Sie in der Antwort unten (z. B. Erstellen einer separaten Gruppe für Knotenbenutzer).
Christopher Will

1
Ich habe nicht node_modulesin /usr/local/lib/. wtf?
Connor Leech

27
Was auch immer Sie tun - ABSOLUT führen Sie 'sudo chmod -R whoami' nicht auf / usr / local / lib oder / usr / lib / aus. Sie werden Ihre sudoers-Datei ruinieren und sich selbst hassen.
Qodeninja

7
alle, bitte stimmen Sie ab ... Then I ran sudo chown -R $USER /* and everything was fine- NEIN - Sie ruinieren Ihre Maschine.
Commonpike

75

Das Ändern des Besitzers in "system-globalen" Ordnern ist ein Hack. Bei einer Neuinstallation würde ich NPM so konfigurieren, dass ein bereits beschreibbarer Speicherort für "benutzer-globale" Programme verwendet wird:

npm config set prefix ~/npm

Stellen Sie dann sicher, dass Sie diesen Ordner Ihrem Pfad hinzufügen:

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

Siehe @ErikAndreas ' Antwort auf NPM-Module, die ohne sudo nicht global installiert werden können, und eine längere Schritt-für-Schritt-Anleitung von @sindresorhus mit ebenfalls festgelegten Sätzen $MANPATH.


Ich stimme voll und ganz zu, außer ich würde vorschlagen, dass sich $HOMEIhr .profileSkript normalerweise um $PATHdas nächste Mal kümmert , wenn Sie das Präfix auf "setzen" (z. B. wenn Sie sich das nächste Mal anmelden).
Jess Austin

@JessAustin: Vielleicht, aber es bringt auch mehr Unordnung in Ihre $HOMEund könnte andere (zukünftige?) NPM-Dateien / Unterordner stören. Ziehen Sie es vor, Binärdateien von verschiedenen Paketmanagern / Sprachen / Buildsystemen getrennt zu halten und $PATHstattdessen explizit (in einem Anmeldezeitskript) festzulegen.
Joel Purra

Eh, Unordnung? Wir sprechen hier nur von global installierten Modulen in ~/lib/node_modules, mit der zugehörigen CLI, falls vorhanden, in ~/bin. Für viele Anwender, vor allem , wenn sie nicht über root, beide ~/binund sind ~/libbereits vorhanden.
Jess Austin

@ JessAustin: Es geht auch um Namenskollisionen für Bibliotheken und Binärdateien. Angenommen, Sie zeigen auf NPM, um Binärdateien einzufügen, ~/binund machen dasselbe für einen oder zwei zusätzliche Paketmanager. Es kann heute oder morgen nicht passieren, aber es besteht ein klares Risiko, dass zwei Pakete von verschiedenen Managern eine Namenskollision haben und die Dateien der anderen überschreiben. Das ist gut genug für mich, um separate Präfixe zu haben. (Konkrete Beispiele wären
willkommen

1
Dies sollte als beste Antwort akzeptiert werden. Das Ändern von systemglobalen Ordnern kann gefährlich sein.
Vladimir Marton

58

Dies trat bei der Installation von Recess ( https://github.com/twitter/recess ) auf, um mein CSS für Bootstrap 3 zu kompilieren.

Bei der Installation der Aussparung:

-npm install recess -g
  1. Sie müssen Berechtigungen in Ihrem homeVerzeichnis entsperren , wie Noah sagt:

    sudo chown -R `whoami` ~/.npm
  2. Sie benötigen auch Schreibberechtigungen für das node_modulesVerzeichnis, wie Xilo sagt. Wenn es immer noch nicht funktioniert, versuchen Sie Folgendes :

    sudo chown -R `whoami` /usr/local/lib/node_modules
  3. Wenn immer noch Fehler angezeigt werden, müssen Sie möglicherweise auch die Berechtigungen korrigieren/usr/local :

    sudo chown -R `whoami` /usr/local

Bitte beachten Sie, dass, wie in diesem Beitrag angegeben, /usr/local/ kein Systemverzeichnis ist, wenn Sie auf einem Mac arbeiten. Daher ist diese Antwort für Mac-Benutzer absolut "sicher". Wenn Sie jedoch unter Linux arbeiten, finden Sie in der folgenden Antwort von Christopher Will eine benutzerfreundliche, systemdirektsichere (aber komplexere) Lösung.


35
Das ist eine schlechte Idee. Sie möchten wahrscheinlich nicht, dass Systemverzeichnisse einem bestimmten Benutzer gehören. Neben schwerwiegenden Sicherheitsbedenken ist dies auch nicht mehrbenutzerkompatibel.
Christopher Will

2
Ja, aber es ist eine großartige Lösung für eine Entwicklungsumgebung +2, insbesondere wenn Sie node.js bereits installiert haben und einfach weiter rocken müssen!
Elliotrock

Sie sollten wirklich keine Pakete außerhalb Ihres Home-Verzeichnisses besitzen
Ben

1
Wenn es sich nicht in Ihrem Home-Ordner befindet, handelt es sich trotz gegenteiliger Behauptungen um ein Systemverzeichnis. Nur weil es nicht von OS X verwendet wird, heißt das nicht, dass es kein Systemverzeichnis ist.
Rich Remer

53

Achtung!!! Achtung!!! Achtung!!!

chown oder chmod ist aus Sicherheitsgründen NICHT die Lösung.

Tun Sie stattdessen Folgendes:

Überprüfen Sie zuerst, wohin npm zeigt, wenn Sie anrufen:

npm config get prefix

Wenn / usr zurückgegeben wird, können Sie Folgendes tun:

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

Dadurch wird ein npm-Verzeichnis in Ihrem Home-Verzeichnis erstellt und darauf npmverwiesen.

Um diese Änderungen dauerhaft zu erhalten, müssen Sie den Befehl export zu Ihrer .bashrc hinzufügen:

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

sollte ich nur zu Option 2 wechseln, wenn ich / usr habe?
Albert Laure

3
Beachten Sie, dass der letzte Befehl tatsächlich den Inhalt von ausgibt $PATH, nicht die Zeichenfolge selbst. Das solltest du ändern.
Veluria

1
Das hat es behoben! Vielen Dank. Ich bekam 'Erlaubnis verweigert,
Verknüpfung aufheben

1
Dies ist die beste Antwort. Dies ist der empfohlene Weg, um das Problem zu lösen.
Paulo Coghi - Wiedereinsetzung Monica

Warum ist Chowning ein Sicherheitsrisiko?
Frank

40

Andere Antworten schlagen vor, die Eigentümer oder Berechtigungen von Systemverzeichnissen für einen bestimmten Benutzer zu ändern. Ich rate dringend davon ab, dies kann sehr umständlich werden und das gesamte System durcheinander bringen!

Hier ist ein allgemeinerer und sicherer Ansatz, der auch Mehrbenutzer unterstützt.

Erstellen Sie eine neue Gruppe für Knotenbenutzer und fügen Sie die erforderlichen Benutzer zu dieser Gruppe hinzu. Legen Sie dann den Besitz von knotenabhängigen Dateien / Verzeichnissen auf diese Gruppe fest.

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

Jetzt können Sie Ihre Module einfach als Benutzer installieren

npm install -g generator-angular

Einige Module (Grunzen, Laube, Yo usw.) müssen noch als Root installiert werden. Dies liegt daran, dass sie Symlinks in / user / bin / erstellen.

Bearbeiten

3 Jahre später würde ich empfehlen, Node Version Manager zu verwenden . Das spart Ihnen viel Zeit und Ärger.


2
Wenn der Knoten von Quellen installiert wird, obwohl Mehrbenutzer ein Problem darstellen würden, würden alle Module ohne die Verwendung von sudo einwandfrei funktionieren. Dies ist auch sehr wichtig, da im Fall des Yeoman-Moduls die Generatoren nicht durch Sudoing der Yeoman-Anwendung aktualisiert werden können, da dies keine
Sudo-

1
Unter Linux verwende ich normalerweise die integrierte staffGruppe, um meinen Entwicklungsordnern Berechtigungen zu erteilen. Es ist auch eine gute Idee, auszuführen chmod g+ws node_modules, um sicherzustellen, dass Ihre Gruppe über Lese- / Schreibberechtigungen verfügt.
Jackvsworld

@jackvsworld Mir war die Mitarbeitergruppe nicht bekannt. Ich denke, dies wäre eine reibungslosere Lösung, da man keine neue fiktive Gruppe erstellen muss, obwohl dies weniger explizit wäre. Aber danke für diesen Beitrag.
Christopher Will

Im Allgemeinen /usr/libwird von Ihrem Systempaket-Manager gesteuert, und Sie sollten dort keine Änderungen vornehmen.
Rich Remer

23

Die offizielle Dokumentation zum Beheben von npm installBerechtigungen mit einem EACCESFehler finden Sie unter https://docs.npmjs.com/getting-started/fixing-npm-permissions .

Ich habe dieses Problem nach einer Neuinstallation des Knotens mit dem .pkgInstallationsprogramm unter OSX festgestellt. Hier gibt es einige gute Antworten, aber ich habe noch keinen Link zu npmjs.com gesehen.

Option 1: Ändern Sie die Berechtigung in das Standardverzeichnis von npm

  1. Suchen Sie den Pfad zum Verzeichnis von npm:

    npm config get prefix

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

WARNUNG : Wenn der angezeigte Pfad nur / usr ist , wechseln Sie zu Option 2 .

  1. Ä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 .

Option 2: Ändern Sie das Standardverzeichnis von npm in ein anderes Verzeichnis

Es gibt Zeiten, in denen Sie den Besitz des von npm verwendeten Standardverzeichnisses (dh / usr ) nicht ändern möchten, da dies zu Problemen führen kann, z. B. wenn Sie das System für andere Benutzer freigeben.

Stattdessen können Sie npm so konfigurieren, dass insgesamt ein anderes Verzeichnis verwendet wird. In unserem Fall ist dies ein verstecktes Verzeichnis in unserem Home-Ordner.

  1. Erstellen Sie ein Verzeichnis für globale Installationen:

    mkdir ~/.npm-global
  2. Konfigurieren Sie npm für die Verwendung des neuen Verzeichnispfads:

    npm config set prefix '~/.npm-global'
  3. Öffnen oder erstellen Sie eine ~ / .profile-Datei und fügen Sie diese Zeile hinzu:

    export PATH=~/.npm-global/bin:$PATH
  4. Aktualisieren Sie in der Befehlszeile Ihre Systemvariablen:

    source ~/.profile

1
Danke, dieser hat für mich funktioniert, wie es die Chown-Lösung nicht tat. Du hast mich gerettet.
fmquaglia

sollte ich nur zu Option 2 wechseln, wenn ich / usr habe?
Albert Laure

Ich mag die Option 2 dieser Antwort. (1) Sie weist nicht die Sicherheitslücken auf, die bei der Verwendung von sudo auftreten, (2) sie bewahrt die Architektur für andere Benutzer, (3) sie verweist auf die Dokumentation und (4) sie verfügt über die erforderliche Befehlszeile Einträge enthalten. Vielen Dank für das Hinzufügen!
Tom Rose

Was passiert also, wenn Sie etwas installieren, mit dem eine Verknüpfung besteht /usr/bin/? Jetzt kann nur Ihr Benutzer darauf zugreifen. Sie melden sich als jemand anderes an, haben immer noch keinen Zugriff, da sich die Dateien tatsächlich im Home-Verzeichnis eines anderen Benutzers befinden!
Frans

Schön, dass dieser für mich gearbeitet hat. Danke für die Erklärung zusätzlich zu den Befehlen.
FrankByte.com

12

Als ob wir hier mehr Antworten brauchen, aber trotzdem ..

Sindre Sorus hat eine Anleitung Installieren von npm-Paketen global ohne sudo unter OS X und Linux , in der beschrieben wird, wie eine saubere Installation ohne Beeinträchtigung der Berechtigungen durchgeführt wird:

Hier finden Sie eine Möglichkeit, Pakete für einen bestimmten Benutzer global zu installieren.

  1. Erstellen Sie ein Verzeichnis für Ihre globalen Pakete

    mkdir "${HOME}/.npm-packages"
  2. Verweisen Sie auf dieses Verzeichnis für die zukünftige Verwendung in Ihrer .bashrc / .zshrc:

    NPM_PACKAGES="${HOME}/.npm-packages"
  3. Geben Sie npm an, wo Ihr global installiertes Paket gespeichert werden soll. Fügen Sie in Ihrer $HOME/.npmrcDatei Folgendes hinzu:

    prefix=${HOME}/.npm-packages
  4. Stellen Sie sicher, dass der Knoten sie findet. Fügen Sie Ihrer .bashrc / .zshrc Folgendes hinzu:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
  5. Stellen Sie sicher, dass Sie installierte Binärdateien und Manpages finden. Fügen Sie Ihrem .bashrc/ Folgendes hinzu .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)"

Schauen Sie sich npm-g_nosudo an, um die obigen Schritte automatisch auszuführen

Überprüfen Sie die Quelle dieses Handbuchs auf die neuesten Updates.


2
tx für die Bearbeitung @AndyHayden :) Meine bevorzugte Methode wird in den obigen Kommentaren vorgeschlagen: Verwenden Sie NVM! stackoverflow.com/a/24404451/1480391
ptim

Die einzige Lösung, die für mich funktioniert hat, bei der es nicht darum geht, mit Berechtigungen herumzuspielen. Ich hasse NPM und seine idiotische Erlaubnis Dummheit. Danke für die Lösung!
RyanNerd

8

TL; DR

Verwenden Sie immer sudo -ioder sudo -Hbeim Ausführen npm install, um globale Pakete zu installieren.

- -

Wenn Sie es verwenden npm, werden Pakete in Ihr Benutzer-Home-Verzeichnis heruntergeladen. Wenn Sie als sudo ausgeführt werden, werden npmDateien in demselben Verzeichnis installiert, aber jetzt gehören sie root.

Das passiert also absolut jeder einzelnen Person, die jemals benutzt hat npm:

  • Installieren Sie einige lokale Pakete ohne Probleme mit npm install foo
  • Installieren Sie das globale Paket sudo install -g foo-cliohne Probleme
  • Versuchen Sie, das lokale Paket mit zu installieren npm install bar
  • Seien Sie frustriert über die npmDesigner, jetzt wo Sie wieder in chmodein Verzeichnis gehen müssen

Wenn Sie die Option -ioder -Hmit sudo verwenden, ist Ihr Home-Verzeichnis das rootHome-Verzeichnis. Alle mögliche globale installiert werden cachen Pakete /root/.npmstatt root-ige Dateien an /home/me/.npm.

Verwenden Sie einfach immer sudo -ioder sudo -Hbeim Ausführen npm install, um globale Pakete zu installieren, und Ihre npmBerechtigungsprobleme verschwinden.

Für immer.

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

- Siehe die akzeptierte Antwort für das Reparieren eines bereits gefickten npm.


beste und einfachste Lösung
Manjeet Singh

6

Ich hatte ein ähnliches Problem bei NPM-Modulen , die ohne sudo nicht global installiert werden können . Das Problem war, dass ich es bei der Installation des Knotens mit sudo über chris / lea ppa repo gemacht habe .

Meine Lösung bestand darin, den Knoten zu deinstallieren und dann folgendermaßen 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 $ USER -R / usr / local

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

PD: Wenn Sie den Besitz des Ordners / usr / local nicht ändern möchten, können Sie ihn an einem Ort installieren, den Sie bereits besitzen. Das Problem dieses Ansatzes ist, dass Sie den Installationsordner mit der Bash-Befehlszeile verbinden müssen, damit wir den Node-Befehl später verwenden können

mkdir ~ / opt

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

echo 'export PATH = ~ / opt / bin: $ {PATH}' >> ~ / .bashrc #or ~ / .profile oder ~ / .bash_profile oder ~ / .zshenv je nach aktuellem Betriebssystem

Mit einem dieser Ansätze können Sie Folgendes ausführen, ohne sudo zu verwenden

npm install -g module_to_install


1
Am Ende habe ich diese Methode angewendet. Hat Verwendung sudo chown $USER /use/localvor dem Bau. Sieht soweit gut aus, Zeit zu versuchen, Atom zu bauen! Vielen Dank!
Prasanthv

6

Wenn Sie npm install -g somepackage ausführen, wird möglicherweise ein EACCES-Fehler angezeigt, in dem Sie aufgefordert werden, den Befehl erneut als root / Administrator auszuführen. Es ist ein Berechtigungsproblem.

Es ist einfach zu reparieren , öffnen Sie Ihr Terminal (Anwendungen> Dienstprogramme> Terminal)

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

** Ich empfehle Ihnen dringend, die Paketverwaltung nicht mit sudo zu verwenden (sudo npm -g etwas installieren), da Sie später einige Probleme bekommen können **

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


Yay! Dieser hat es mir angetan! nachdem die anderen andere , die oben tun: sudo chown -R `whoami` ~/.npm, sudo chown -R `whoami` /usr/local/libund
Regis Zaleman

8
Dies kann bei vielen anderen Apps zu Berechtigungsproblemen führen. Ich würde daher empfehlen , dies nicht zu tun. Warum eine Dose Würmer gegen eine andere tauschen?
Brad Parks

1
Oder verfeinern Sie es zumindest in / usr / local / lib / node_modules.
Ken

Dies, das und mehr das. Nachdem ich meinen Kopf gegen eine Wand geschlagen hatte, war dies der Trick. +1
dashard

Das war mein Problem. Auf einem neuen Macbook (os x 10.10.3) lauteten die Berechtigungen für / usr / local / lib / node_modules: $ ll / usr / local / lib / node_modules total 0 drwxr-xr-x 3 24561 Rad 102B 31. März 18:19 . drwxrwxr-x 4 24561 admin 136B 31. März 18:19 .. drwxr-xr-x 26 65534 Mitarbeiter 884B 13. April 10:53 npm
tkane2000

5

Für Mac (übernommen von Christoper Wills Antwort)

Mac OS X 10.9.4

  1. Systemeinstellungen> Benutzer & Gruppen> (Entsperren)> Drücken Sie +:

    Neues Konto> "Gruppe"
    Kontoname : nodegrp

    Aktivieren Sie nach dem Erstellen der Gruppe den Benutzer, der in diese Gruppe aufgenommen werden soll

  2. sudo chgrp -R knotengrp / usr / lokal / lib / knotenmodule /
    sudo chgrp knotengrp / usr / bin /
    knoten sudo chgrp knotengrp / usr / bin / npm
    sudo chown -R $ (whoami): knotengrp ~ / .npm


1
Ich musste ein paar Pfade zu / usr / local / bin ändern, aber ansonsten funktionierte diese Lösung auf meinem OX X 10.9-Computer hervorragend - danke!
splig

Schlechte Vorgehensweise, um den Besitz von Systemverzeichnissen zu ändern.
Rich Remer

@richremer Ich denke, es hängt davon ab, was Sie erreichen wollen. Wenn der Ordner ursprünglich nur für den Sudoer zugänglich ist, kann er nur auf diese Weise geändert werden. Wir beschränken die Änderung auf den Ordner, der sich auf npm bezieht. Wäre es sicherer, sudodiese Ordnergruppen zu behalten oder zu ändern, damit sie vom normalen Benutzer geändert werden können? Wenn ein normaler Benutzer keine Aktion für diesen Ordner ausführen soll, sollte dies natürlich nicht den Gruppenbesitz des Ordners ändern.
Ken

Am besten installieren Sie globale Pakete mit sudo, aber mit dem -HFlag. Insbesondere sudo -H npm install -g <pkg>. Dies stellt eine ordnungsgemäße Abgrenzung der Berechtigungen für System- und Benutzerordner sicher. Was Sie nicht tun möchten, ist die Verwendung sudo npm install -g, da dadurch Root-Dateien in Ihrem Benutzerverzeichnis installiert werden. Es wäre großartig, wenn npm klug genug wäre, dies richtig zu machen, aber das ist nicht der Fall. Sie müssen also das -Hsudo-Flag verwenden, um eine ordnungsgemäße globale Installation durchzuführen.
Rich Remer

4

In meinem Fall liegt es an der Erlaubnis von ~ / tmp. Also mache ich:

sudo chown -R $USER ~/tmp

Und es ist in Ordnung!


4

Für mich nur ausführen

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

funktioniert nicht Dann führe ich auch aus

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

Und alles funktioniert gut!


Sie sind sehr genial, Sir :)
user805981

Dateien in /usr/libsind Systemdateien und sollten nicht Ihrem persönlichen Benutzerkonto gehören.
Rich Remer

4

PROBLEM : Sie (der Benutzer) haben nicht die richtigen Berechtigungen für das Verzeichnis.

Der sofortige Ausweg besteht darin, die npm-Installation mit sudo auszuführen. Dies kann jedoch zu demselben Fehler oder zu einer fehlerhaften Installation führen.

UND das Ändern des Verzeichnisbesitzes ist keine gute Option, ein temporärer Patch.


Lösung / Vorschlag : Ändern Sie das Standardverzeichnis von npm (aus offiziellen Dokumenten) ).

Sichern Sie Ihren Computer, bevor Sie fortfahren.

(optional) Falls Sie eine fehlerhafte Installation haben, deinstallieren Sie diese zuerst:

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. Erstellen Sie ein Verzeichnis für globale Installationen:

    mkdir ~/.npm-global

  2. Konfigurieren Sie npm für die Verwendung des neuen Verzeichnispfads:

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

  3. Öffnen oder erstellen Sie eine ~/.profileoder ~/.bash_profile-Datei und fügen Sie diese Zeile hinzu:

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

  4. Aktualisieren Sie in der Befehlszeile Ihre Systemvariablen oder starten Sie das Terminal neu:

    source ~/.profile

  5. (optional) Test: Laden Sie ein Paket global herunter, ohne sudo zu verwenden.

    npm install -g jshint


3

Falls sudo chown -R $(whoami) ~/.npmes für Sie nicht funktioniert hat oder Sie eine Nicht-Terminal-Befehlslösung benötigen.

Das Problem besteht darin, dass Ihr Benutzerkonto keine Schreibberechtigung für den Ordner node_modules hat. Sie können also Folgendes tun

  1. Öffnen Sie den Finder und drücken Sie cmd+ shift+. gDadurch wird der Ordner mit der URL geöffnet

  2. Schreiben Sie den folgenden Pfad /usr/local/lib/node_modulesund drücken Sie go

  3. Klicken Sie mit der rechten Maustaste auf node_modulesOrdner und wählen SieGet Info

  4. Scrollen Sie nach unten zum sharing & permissionsAbschnitt

  5. Entsperren, um Änderungen vornehmen zu können.

  6. Drücken Sie +und fügen Sie Ihr Benutzerkonto hinzu

  7. Stellen Sie sicher, dass Sie Read & Writein der Dropdown- Liste Berechtigungen auswählen

Jetzt sollten Sie in der Lage sein, Pakete ohne zu installieren, sudound Berechtigungsprobleme sollten behoben sein


3

Problem: Sie haben keine Berechtigung zum Schreiben in die Verzeichnisse, in denen npm globale Pakete und Befehle speichert.

Lösung: Erlauben Sie die Berechtigung für npm.

Öffnen Sie ein Terminal:

Befehl + Leertaste, dann 'Terminal' eingeben

Geben Sie diesen Befehl ein:

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
  • Hinweis: Hierfür ist Ihr Passwort erforderlich.

Diese Lösung ermöglicht die Berechtigung NUR der benötigten Verzeichnisse, wodurch die anderen Verzeichnisse schön und sicher bleiben.


Downvoting, da das Festlegen des Benutzereigentums an Systemordnern ein Anti-Pattern ist und dies nicht berücksichtigt wird. In dem speziellen Fall, dass npm config get prefixetwas im Basisordner zurückgegeben wird, behebt diese Lösung die Berechtigungen, behebt jedoch nicht das zugrunde liegende Problem der sicheren Installation globaler Pakete für eine gemeinsam genutzte Umgebung.
Rich Remer

Dadurch werden die Berechtigungen eines großen Teils des Betriebssystems neu geschrieben. Wenn Sie dies beispielsweise in Ubuntu ausführen, wird der Befehl "sudo" selbst unbrauchbar.
Sahand Seifi

2

Führen Sie die folgenden Befehle aus, um NPM ordnungsgemäß zu konfigurieren:

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

2

Sie könnten dies versuchen, funktioniert auf Ubuntu und Mac

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

1
Ich lief dies und arbeitete 100% für mich auf einem Mac: sudo chown -R $ (whoami) / usr / local / lib / node_modules
leeroya

1

Was mir als die beste Option erscheint, ist die in der npm-Dokumentation vorgeschlagene, bei der zunächst überprüft wird, wo standardmäßig globale Knotenmodule installiert sind, indem sie ausgeführt werdennpm config get prefix . Wenn Sie wie bei Trusty erhalten, /usrmöchten Sie es möglicherweise in einen Ordner ändern, den Sie sicher besitzen können, ohne die Dinge so durcheinander zu bringen, wie ich es getan habe.

Wählen Sie dazu einen neuen Ordner in Ihrem System aus oder erstellen Sie ihn. Vielleicht möchten Sie es in Ihrem Home-Verzeichnis oder, wie ich, aus Gründen der /usr/localKonsistenz unter haben, da ich auch ein Mac-Benutzer bin (ich bevorzuge es, nicht an verschiedenen Stellen nachsehen zu müssen, je nachdem, auf welchem ​​Computer ich mich gerade befinde). Ein weiterer guter Grund dafür ist die Tatsache, dass sich der /usr/localOrdner wahrscheinlich bereits in Ihrem PATH befindet (es sei denn, Sie möchten mit Ihrem PATH herumspielen), aber wahrscheinlich ist Ihr neu erstellter Ordner nicht vorhanden und Sie müssen ihn dem hinzufügen PFADEN Sie sich auf Ihrem .bash-Profil oder .bashrc - Datei.

Kurz gesagt, ich habe den Standardspeicherort der globalen Module mit geändert npm config set prefix '/usr/local', den Ordner erstellt /usr/local/lib/node_modules(er wird von npm verwendet) und die Berechtigungen für die von npm verwendeten Ordner mit dem folgenden Befehl geändert:

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

Jetzt können Sie jedes Modul global sicher installieren. Hoffe das hilft!


1

So habe ich das Problem unter Windows 8.1 gelöst:

  • Wechseln Sie zu Ihrer NodeJS-Installation (normalerweise C: \ Programme \ NodeJS).
  • Klicken Sie mit der rechten Maustaste auf den Ordner node_modules und gehen Sie zu Eigenschaften
  • Klicken Sie auf die Registerkarte Sicherheit und erweitern Sie
  • Oben sehen Sie "Besitzer: SYSTEM", klicken Sie auf Ändern
  • Geben Sie den Benutzer ein, für den Sie Berechtigungen wünschen, und klicken Sie auf OK
  • Aktivieren Sie das Kontrollkästchen unten in den erweiterten Einstellungen "Alle untergeordneten Objektberechtigungseinträge durch vererbbare Berechtigungseinträge von diesem Objekt ersetzen" und klicken Sie auf "OK"
  • Führen Sie die erforderlichen npm-Installationen / -Updates durch

1

Die beste Lösung wäre diese, die in der npm-Dokumentation bereitgestellt wird.


Für Ubuntu ist die vorgeschlagene Lösung Option 2

Kurze Schritte:
Erstellen Sie ein Verzeichnis für globale Installationen:
mkdir ~/.npm-global

Konfigurieren Sie npm für die Verwendung des neuen Verzeichnispfads: Mithilfe dieser Option können Sie überprüfen, ob das Präfix aktualisiert wurde oder nicht. Das Ergebnis wäre <Ihr Home-Verzeichnis> / .npm-global
npm config set prefix '~/.npm-global'
npm config get prefix

Öffnen oder erstellen Sie eine ~ / .profile-Datei und fügen Sie diese Zeile hinzu:
export PATH=~/.npm-global/bin:$PATH

Aktualisieren Sie in der Befehlszeile Ihre Systemvariablen:
source ~/.profile

Anstelle der Schritte 2 bis 4 können Sie auch die entsprechende ENV-Variable verwenden (z. B. wenn Sie ~ / .profile nicht ändern möchten):

NPM_CONFIG_PREFIX=~/.npm-global


Für Mac ist die vorgeschlagene Lösung Option 3

Unter Mac OS können Sie dieses Problem mithilfe des Homebrew-Paketmanagers vollständig vermeiden

brew install node


Dieses NPM_CONFIG_PREFIX funktioniert nicht. Dies ist ein Fehler in der npm-Beschreibung. Siehe meinen Beitrag oben, wie es richtig gemacht wird: stackoverflow.com/a/41395398/1256697
suther

1

Ich löse es, indem ich den Besitzer von root in meinen Benutzernamen ändere

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

Ändere mich mit deinem Benutzernamen und deiner Gruppe.


1

Ich benutze gerne Ubuntu-Gruppen, um dies zu erreichen, anstatt den Besitzer zu wechseln. Es ist ganz einfach.

  1. Installieren Sie zuerst nodejs und npm mit apt-get

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

  2. Finden Sie heraus, wer angemeldet ist, dh der Benutzername, und führen Sie den folgenden Befehl aus, um ihn im Terminal anzuzeigen

    whoami

  3. Sie können die Liste der Ihnen zugewiesenen Gruppen mit einem sehr einfachen Befehl anzeigen. Normalerweise ist die erste Gruppe Ihr Benutzername

    groups

  4. Führen Sie Folgendes aus, um dem angemeldeten Benutzer den Zugriff zu ermöglichen

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

  5. Aktualisieren Sie npm und nodejs

    npm install -g npm

Sie sind fertig, Ihr Benutzer kann npm-Befehle ohne sudo ausführen

Sie können auch auf diesen Link https://askubuntu.com/a/1115373/687804 verweisen


0

Unter Mac OS X, wenn bei der Installation von Homebrew ist brew install npm , ist der Installationspfad /usr/local/share/npm/mit den beiden bin/undlib/node_modules/ Unterordner.

Wenn Sie diesen Befehl ausführen, um zum Eigentümer Ihres aktuell angemeldeten Benutzers zu wechseln, sollte dies alles behoben sein und Sie können globale NPM-Pakete ohne installieren sudo.

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


1
Heutzutage würde ich meine andere Antwort auf diese Frage empfehlen , die npm configstattdessen verwendet wird.
Joel Purra

0

Eigentlich hatte ich auch das gleiche Problem. Ich habe Ubuntu ausgeführt. Mein Problem entsteht, weil ich meinen öffentlichen Schlüssel des Ubuntu verloren hatte. Selbst die Aktualisierung meines Systems fand nicht statt. Es gab einen GPG-Fehler. In diesem Fall können Sie Ihren Schlüssel mit diesem Befehl wiedererlangen:

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

Danach funktioniert npm gut!


0

John Papa verweist auf die Geschichte und die Argumentation hinter diesem Problem und gibt eine solide Lösung :

John Papas Schritte sind:

  1. Verwenden Sie Brew, um den Knoten ohne npm zu installieren
  2. Aktualisieren Sie Ihr .bash_profile / .bashrc, damit npm und node wissen, wo Pakete installiert und gefunden werden müssen
  3. Verwenden Sie Brew, um den Knoten zu aktualisieren, und npm, um sich selbst zu aktualisieren

Hoffe das hilft den Neugierigen!


0

Dies ist die Lösung, die ich verwendet und gearbeitet habe. Ich habe versucht, whoaminie funktioniert zu verwenden.

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

dann

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

dann

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


0

Die Antwort von @Yves M. war meiner Lösung sehr ähnlich. Hier sind die Befehle, die ich verwendet habe und die sich geringfügig von seinen unterschieden.

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

Fragen Sie dann nach der neuesten Version:

nvm ls-remote

Dann installieren Sie die neueste Version:

nvm install YOUR_VERSION_HERE

Beispiel

nvm install v5.8.0
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.