globales Pfadpräfix npm


142

Ich bin vorsichtiger als sonst, weil mich das Verhalten npmin der Vergangenheit verwirrt hat.

Ich bin auf einem Mac und habe node.js durch installiert brew install node.

Jetzt, da ich in jslint.jsder Befehlszeile als Befehl ausgeführt werden möchte, stelle jslintich fest, dass der kanonische Weg, dies zu erreichen, der ist, sudo npm install -g jslintder mit dieser Ausgabe erfolgreich ausgeführt wurde:

$ sudo npm install -g jslint
npm http GET https://registry.npmjs.org/jslint
npm http 200 https://registry.npmjs.org/jslint
npm http GET https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http 200 https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http GET https://registry.npmjs.org/nopt
npm http 200 https://registry.npmjs.org/nopt
npm http GET https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http 200 https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http GET https://registry.npmjs.org/abbrev
npm http 200 https://registry.npmjs.org/abbrev
npm http GET https://registry.npmjs.org/abbrev/-/abbrev-l.0.4.tgz
npm http 200 https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz
/usr/local/share/npm/bin/jslint -> /usr/local/share/npm/lib/node_modules/jslint/
bin/jslint.js
jslint@0.1.9 /usr/local/share/npm/lib/node_modules/jslint
└── nopt@1.0.10 (abbrev@1.0.4)

Anschließend

$ jslint ply.js
zsh: command not found: jslint

weil /usr/local/share/npm/binich nicht in meinem bin $PATH.

1) Warum wurde brewGlobal npm binPath to Path nicht installiert ? Vielleicht hat es das getan, aber etwas zshbringt es durcheinander. Wo könnte ich das finden?
2) Soll ich das tun? ( :/usr/local/share/npm/binAn den exportierten $PATHunten in meinem anhängen ~/.zshrc)

Es scheint, dass dies nicht der richtige Weg ist, denn wenn ich später etwas anderes installiere (mit Homebrew oder etwas anderem), muss ich es an mein zsh-Startskript anhängen, um den Pfad festzulegen. Ich denke, in diesem speziellen Fall geht es nur darum, npm install -gnicht die richtigen Symlinks an einem "richtigen" Ort zu /usr/local/binerstellen (wie vielleicht).

Ich denke, ich werde manuell Symlinks /usr/local/binfür alle Programme erstellen, mit denen ich Probleme habe, und es sollte für meine Zwecke gut genug sein.

BEARBEITEN : Ich aktualisiere dies im Jahr 2019, da diese alte Frage beliebt ist, aber jetzt sowohl in Bezug auf meinen persönlichen Workflow als auch in Bezug auf die beste Vorgehensweise bei der Installation des Knotens und der Verwaltung seiner verschiedenen Abhängigkeiten veraltet ist.

Mein persönlicher Workflow besteht nun darin, das von nodejs.org erhaltene Installationsprogramm zum Installieren von Node auf Systemen zu verwenden. Ich vertraue diesem mehr als dem Homebrew-Paket selbst, weil es am besten weiß, wie man die Dateien verwaltet. Wenn Sie Ihren Systemknoten von 8.10 auf 10.15 ändern möchten, egal ob auf Mac oder Windows, laden Sie einfach das Installationsprogramm von nodejs.org für 10.15 für Ihr Betriebssystem herunter. Der Versuch, einen über Homebrew installierten Knoten zu aktualisieren, hat sich meiner Erfahrung nach immer als schwieriger erwiesen.

Das Wichtigste ist auch, dass von der Verwendung von sudo, wie in meiner obigen npm-Installation von jslint gezeigt, dringend abgeraten wird. Ich bin mir ziemlich sicher, dass Homebrew-Pakete niemals mit dem Superuser installiert oder in irgendeiner Weise interagiert werden sollten. Es sollte nicht notwendig sein und führt zu Kopfschmerzen bei der Dateiberechtigung!

Außerdem empfehle ich ESLint gegenüber jslint und habe jslint seit Jahren nicht mehr verwendet.


Danke, sie sind jetzt behoben. Ich bin normalerweise nicht so nachlässig, aber ich habe diese Frage sehr schnell geschrieben
Steven Lu

@ DaveNewton Das mache ich normalerweise, ja. Diese Frage war wirklich schlampig, aber eine meiner beliebtesten.
Steven Lu

Ist es nicht einfacher, Text als einen Screenshot zu kopieren? sowieso behoben.

1
@ saleemrashid1 ​​Hey, ich wollte das machen. Hast du es wirklich gelesen und kopiert? Vielen Dank.
Steven Lu

3
Ja! Bitte. Ich arbeite an einem Spiel und während ich darauf wartete, dass NPM Sachen herunterlädt, habe ich es getan!

Antworten:


308

Erweitern Sie Ihre PATHmit:

export PATH=/usr/local/share/npm/bin:$PATH

ist keine schreckliche Idee. Trotzdem sollten Sie es nicht tun müssen.

Führen Sie Folgendes aus:

npm config get prefix

Die Standardeinstellung unter OS X ist /usr/local, dh, npm verknüpft Binärdateien mit /usr/local/bin, die sich bereits auf Ihrer befinden sollten PATH(insbesondere, wenn Sie Homebrew verwenden).

So:

  1. npm config set prefix /usr/local wenn es etwas anderes ist, und
  2. Nicht sudomit npm verwenden! Laut den jslint-Dokumenten sollten Sie nur dazu in der Lage npm installsein.

Wenn Sie npm als sudo ( sudo brew install) installiert haben, versuchen Sie, es mit plain ol 'neu zu installieren brew install. Homebrew soll Ihnen helfen, frei zu bleiben sudo.


1
Vielen Dank! npmweigert sich jedoch, jslintglobal zu installieren . npm install -g jslintschlägt fehl. Error: EACCES, open '/Users/user/.npm/564fcf84-jslint.lock'
Steven Lu

2
Müsste ich das nicht, chown /usr/localwenn Skripte Links in das Skript schreiben sollen, ohne dass dies erforderlich ist sudo? Wie wäre es, wenn Sie dies befolgen, um nom / node einzurichten ~/.localoder so?
Steven Lu

2
SÜSS! Ich habe die verschiedenen Verzeichnisse, die der Benutzer rootin meinem Verzeichnis hinterlegt hat ~/(von sudo rm -ron tmp/und a .npm/), aufgehoben und anschließend npm install -g jslintwunderbar funktioniert. Es ist schön, dass npm selbst ein Knotenprogramm ist und für mich ein bisschen ein JS-Befehlszeilen-Proof-of-Concept ist, den ich jetzt zu schätzen beginne, da ich es ein bisschen besser verstehe.
Steven Lu

2
@StevenLu Ja, chown-ing /usr/localund alles darin ist unter OS X Standard. Siehe die Seite zur Fehlerbehebung im Homebrew-Wiki.
Trevor Burnham

Ja, es sieht so aus, als ob das chownIng /usr/localbereits auf meinem Computer aufgetreten ist, sonst könnten npmet al. Ohne sudoLinks keine Links hinterlegen /usr/local/bin/usw.
Steven Lu

8

Verbrachte eine Weile mit diesem Problem, und der PATH-Schalter half nicht. Mein Problem war der hier gefundene Homebrew / node / npm-Fehler - https://github.com/npm/npm/issues/3794

Wenn Sie den Knoten bereits mit Homebrew installiert haben, versuchen Sie ****. Beachten Sie laut Kommentaren, dass dies möglicherweise nicht sicher ist. Es hat bei mir funktioniert, könnte aber unbeabsichtigte Konsequenzen haben. Es scheint auch, dass die neueste Version von Homebrew npm ordnungsgemäß installiert. So wahrscheinlich würde ich versuchen brew update, brew doctor, brew upgrade nodeetc , bevor Sie versuchen ****:

npm update -gf

Wenn Sie Node mit Homebrew installieren und npm arbeiten lassen möchten, verwenden Sie:

brew install node --without-npm
curl -L https://npmjs.org/install.sh | sh

3
Es ist keine gute Idee, beiläufig zu empfehlen, dass Personen weltweit ein Update erzwingen.
Toxaq

1
Es ist keine gute Idee, den Ratschlägen von jemandem im Internet blind zu folgen.
Volte

Die Force-Methode auf -gf hat es für mich gemacht. Danke dir.
MEM

5

Ich benutze Brew und das Präfix war bereits so eingestellt:

$ npm config get prefix
/Users/[user]/.node

Ich habe festgestellt, dass der Ordner bin und lib im Besitz von root sind, was die übliche Nicht-Sudo-Installation verhinderte, sodass ich sie dem Benutzer wieder besaß

$ cd /Users/[user]/.node
$ chown -R [user]:[group] lib
$ chown -R [user]:[group] bin

Dann habe ich einfach den Pfad zu meinem .bash_profile hinzugefügt, das sich unter / Users / [user] befindet.

PATH=$PATH:~/.node/bin

3

Zum Brauen sollte es nicht erforderlich sein, sudo zu verwenden, selbst wenn npm mit -g ausgeführt wird. Dies könnte später tatsächlich zu weiteren Problemen führen.

In der Regel können Sie mit Brew oder Port Ihren Pfad aktualisieren, sodass Sie nicht riskieren, Ihre .zshrc-, .bashrc-, .cshrc- oder die von Ihnen verwendete Shell-Variante zu verfälschen.


In der Tat erfordert und empfiehlt Brauen nicht gegen die Verwendung von sudo. Ich habe sudo verwendet npm(weil mir etwas, das ich gelesen habe, gesagt hat). Ich bin gespannt, wo ich nachsehen kann, wie der Pfad eingestellt ist. Es scheint tatsächlich so, als ob das zshInstallationsprogramm etwas ausführt, das den Pfad (zum Zeitpunkt der Installation von zsh) in den Pfad, den .zshrcich nicht so sehr mag , fest codiert
Steven Lu

Alles, was von installiert wurde, npm sollte in installiert werden /usr/local. Der /usrPfad-Namespace ist für die offiziellen Pakete Ihrer Distribution reserviert. /usr/local/binin Ihrem $ PATH oder nicht, ist ein zsh-Problem.
Floby

Die Brew-Skripte fügen Ihrem Startskript nichts hinzu. Dies ist etwas, was Sie tun müssen. Ein Beispiel finden Sie unter madebyhoundstooth.com/blog/install-node-with-homebrew-on-os-x .
Pascal Belloncle

2

Ich habe es geschafft, Vue Cli no command error wie folgt zu beheben:

  • Im Terminal sudo nano ~/.bash_profile, um Ihr Bash-Profil zu bearbeiten.
  • Hinzufügen export PATH=$PATH:/Users/[your username]/.npm-packages/bin
  • Datei speichern und Terminal neu starten
  • Jetzt sollten Sie in der Lage sein, vue create my-projectund vue --versionetc. zu verwenden .

Ich habe dies getan, nachdem ich das neueste Vue Cli von https://cli.vuejs.org/ installiert habe.

Ich verwende normalerweise Garn, aber ich habe es global mit npm installiert npm install -g @vue/cli. Sie können auch Garn verwenden, wenn Sie möchtenyarn global add @vue/cli

Hinweis: Möglicherweise müssen Sie es zuerst global deinstallieren, wenn Sie es bereits installiert haben: npm uninstall -g vue-cli

Hoffe das hilft!


1
Das hat im Grunde bei mir funktioniert. Ich musste es anpassen, um PATH = $ PATH: / Users / [Ihr Benutzername] /node_modules/.bin
Mike Carpenter


0

Versuchen Sie zu laufen:

PATH=$PATH:~/npm/bin

Führen Sie anschließend einen Test durch, indem Sie ihn expressin der Befehlszeile ausführen. Das hat bei mir funktioniert.


ziemlich sicher, dass du meinst ~/.npm/binoder so. Es sollte kein Verzeichnis zu npmIhrem Heimverzeichnis hinzugefügt werden.
Steven Lu

0

Wenn Sie die Knotenpakete mit dem Befehl sudo verknüpft haben

Wechseln Sie dann zu dem Ordner, in dem node_modules global installiert sind.

Auf Unix-Systemen werden sie bei globaler Installation normalerweise in / usr / local / lib / node oder / usr / local / lib / node_modules abgelegt. Wenn Sie die Umgebungsvariable NODE_PATH auf diesen Pfad setzen, werden die Module nach Knoten gefunden.

Windows XP -% USERPROFILE% \ Anwendungsdaten \ npm \ Knotenmodule Windows 7 -% AppData% \ npm \ Knotenmodule

und führen Sie dann den Befehl aus

ls -l

Dadurch wird die Liste aller globalen Knotenmodule angezeigt, und Sie können die verknüpften Knotenmodule leicht anzeigen.


0

Sudo Brew ist keine Option mehr. Wenn Sie also zu diesem Zeitpunkt mit Brew installieren, erhalten Sie zwei wirklich abscheuliche Dinge: A: Es wird gerne in /usr/local/opts/ gemäß / usr / local / shared installiert . Dies ist zunächst keine große Sache, aber ich hatte Probleme mit dem Knoten PATH, insbesondere wenn ich Lint installiert habe. B: Sie bleiben bei sudo-Befehlen hängen, bis Sie sie entweder deinstallieren und auf diese Weise installieren oder den Stack von Bitnami erhalten

Ich empfehle diese Methode über die Stapeloption, da sie sofort einsatzbereit ist, wenn Sie mehrere Projekte haben. Wenn Sie sich für den vorgefertigten MEAN-Stack entscheiden, müssen Sie virtuelle Hosts in httpd.conf einrichten (mehr ein Problem in diesem Stack als in XAMPP) Projekt, es sei denn, Sie möchten Ihren Server neu terminieren und neu starten, wenn Sie mit dem Aktualisieren fertig sind.


0

Einfache Lösung ist ...

Geben Sie einfach den folgenden Befehl ein:

  1. sudo npm config get prefix

    Wenn es nicht so etwas ist /usr/local, müssen Sie es mit dem folgenden Befehl beheben.

  2. sudo npm config set prefix /usr/local...

Jetzt funktioniert es zu 100% einwandfrei


Es wird dringend empfohlen, Sudo mit npm zu vermeiden. Siehe meine Bearbeitung.
Steven Lu
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.