Ich lerne derzeit Angular und npm. Heute habe ich versucht, dies npm i -g @angular/cli
auf meinem Fedora zu tun, aber anstatt es zu installieren, sah ich im Terminal (ich habe die Meldung der Einfachheit halber gekürzt):
npm WARN checkPermissions Missing write access to /usr/lib/node_modules
Also habe ich bei Google nachgeschaut, was das bedeutet. Ich fanddiese npm-Erklärungund dieser Artikel brachte mich zuein weiterer npm-ArtikelDieser Fehler wird ausführlicher beschrieben. Im letztgenannten Artikel heißt es:
Wenn beim Versuch, ein Paket global zu installieren, ein EACCES-Fehler auftritt, haben Sie folgende Möglichkeiten:
Installieren Sie npm mit einem Node-Versionsmanager neu (empfohlen).
oder
Manuelles Ändern des Standardverzeichnisses von npm
Als schnelle Lösung schienen beide der oben genannten Lösungen in Ordnung zu sein.
Da ich jedoch über einige Erfahrung mit Linux verfüge, begann ich mich zu fragen: Warum muss ich eine andere Software installieren oder überhaupt einige Konfigurationen ändern? Anders ausgedrückt: Warum muss ich bei der Standardkonfiguration für npm und der Standardkonfiguration für Fedora auch nur eine davon anpassen, um Fehler zu vermeiden?
Nachdem ich mir diese Fragen gestellt hatte, dachte ich, dass es an meiner npm-Konfiguration liegen könnte. Höchstwahrscheinlich habe ich seit der Installation nichts geändert, aber wer weiß? Also beschloss ich, npm neu zu installieren. Um sicherzugehen, startete ich den Computer nach der Deinstallation neu. Nach der Neuinstallation versuchte ich es npm i -g @angular/cli
erneut – aber derselbe Fehler trat auf.
Dann dachte ich: Vielleicht liegt es nicht an npm, vielleicht an meiner Fedora-Installation? Aus diesem Grund wollte ich Fedora auf keinen Fall neu installieren. Also habe ich bei Google nachgeschaut, ob Fedoras Standardberechtigungen für das Verzeichnis /usr/lib/node_modules
so sind, wie sie standardmäßig sind. Für mein Verzeichnis waren sowohl für /usr
als /usr/lib
auch /usr/lib/node_modules
(und sogar für /usr/lib/node_modules/npm
) der Eigentümer und die Gruppe root root
und nur der Eigentümer hat Schreibberechtigungen. Die einzige Quelle, die ich fand, war „Fedora 26 Installation Guide“ (obwohl ich Fedora 29 installiert habe), und dieses Dokument riet mir, dieDateisystemhierarchiestandard 2.3für die Verzeichnisstruktur. Da ich erwartet hatte, node_modules
genau die Berechtigungen zugewiesen zu haben, die npm verlangt, habe ich nur /usr
und überprüft /usr/lib
. Für das /usr
Verzeichnis schien FHS nichts über Berechtigungen anzugeben; für das /usr/lib
Verzeichnis stand dort:
/usr/lib enthält Objektdateien, Bibliotheken und interne Binärdateien, die nicht für die direkte Ausführung durch Benutzer oder Shell-Skripte vorgesehen sind. [22]
Auch diese Information war nicht sehr hilfreich.
Schließlich bin ich zu dem Schluss gekommen, dass ich immer noch nicht verstehe, was die wahre Ursache für den Fehler ist, den ich erhalten habe. Daher möchte ich jetzt fragen:
- Muss npm standardmäßig so konfiguriert werden, dass die neuen Pakete eingefügt werden
/usr/lib/node_modules
? - Wenn ja, hat Fedora andere Standardberechtigungen festgelegt, die es für diese Verzeichnisse haben sollte/sollte/darf?
- Wenn nein, habe ich möglicherweise versehentlich die Berechtigungen für diese Verzeichnisse meiner Fedora-Installation geändert?
- Wenn nein, liegt es daran, dass ich npm-Pakete nicht mit Root-Berechtigungen installiere? Dies scheint auch eine Lösung zu sein, aber in der npm-Dokumentation wird eine solche Lösung nicht erwähnt.
- Wenn nein, versuche ich dann, npm-Pakete global zu installieren, obwohl ich das nicht sollte? Wenn ja, warum besteht diese Möglichkeit?
- Gibt es etwas, das ich nicht verstehe oder übersehe? Vielleicht fehlt mir eine (aktuelle) Dokumentation?
AKTUALISIEREN:Ich habe vergessen darauf hinzuweisen, dass ich alle Befehle als normaler Benutzer und nicht als Root ausführe.
Antwort1
Sie haben nicht gesagt, als welcher Benutzer Sie das ausgeführt haben, aber ich nehme an, dass es nicht Root war. In diesem Fall ist der Fehler korrekt, aber auch zu erwarten, da normale Benutzer nicht in der Lage sein sollten, in Systemverzeichnisse zu installieren.
Auf keinen Fall sollten Sie npm
Pakete global mit dem in Fedora gepackten Node.js installieren, schon allein, weil Sie dann mit einem verwirrenden Durcheinander aus per RPM und per NPM verwalteten Modulen zurückbleiben /usr/lib/node_modules
.
Leider unterstützt Node.js im Gegensatz zu anderen Sprachumgebungen keine zwei separaten globalen Modulverzeichnisse (eines /usr
für Module, die von der Systempaketierung verwaltet werden, und eines /usr/local
für Module, die von den eigenen Tools der Sprachumgebung verwaltet werden). Daher können wir dies nicht sinnvoll umsetzen, ohne umfangreiche Patches von npm durchzuführen, die wir nicht durchführen möchten. Selbst wenn eine solche Aufteilung möglich wäre, müssten Sie dennoch Root sein, um eine globale Installation durchzuführen, genau wie bei Perl, Python oder Ruby.
So wie ich es verstehe, wird von Node.js ohnehin von einer globalen Installation abgeraten – die Upstream-Seite ist der Ansicht, dass Sie in jedem Projekt lokal nur die Module installieren sollten, die das Projekt benötigt.