Warum müssen wir gulp global und lokal installieren?

292

2 Handbücher über gulp besagen, dass ich gulp zuerst global (mit dem Flag -g) und dann noch einmal lokal installieren muss. Warum brauche ich das?

Stepan Suworow
quelle
12
Die projekteigene Seite "Erste Schritte" sagt dasselbe. (Sagt auch nicht warum.)
TJ Crowder
11
Ich wünschte, npm könnte global ein Abhängigkeitspaket verwenden, das dieselbe Version wie das lokale Paket hat. 5 MB Glup-Material für jedes Projektverzeichnis: /
Ciantic
@Ciantic Keine Garantie, aber ... ➪ stackoverflow.com/a/25879563/444255
Frank Nocke

Antworten:

238

Wenn Sie ein Tool global installieren, kann es von einem Benutzer überall als Befehlszeilenprogramm verwendet werden, auch außerhalb von Knotenprojekten. Globale Installationen für ein Knotenprojekt sind schlecht, da sie die Bereitstellung erschweren.

npm 5.2+

Das npxmitgelieferte Dienstprogramm npm 5.2löst dieses Problem. Damit können Sie lokal installierte Dienstprogramme wie global installierte Dienstprogramme aufrufen (Sie müssen den Befehl jedoch mit beginnen npx). Wenn Sie beispielsweise eine lokal installierte Datei aufrufen möchten eslint, haben Sie folgende Möglichkeiten:

npx eslint .

npm <5,2

Bei Verwendung in einem scriptFeld Ihrer package.json wird npmnach node_modulesdem Tool sowie nach global installierten Modulen gesucht , sodass die lokale Installation ausreichend ist.

Also, wenn Sie zufrieden sind mit (in Ihrem package.json):

"devDependencies": {
    "gulp": "3.5.2"
}
"scripts": {
    "test": "gulp test"
}

usw. und npm run testwenn Sie mit laufen , sollten Sie die globale Installation überhaupt nicht benötigen.

Beide Methoden sind nützlich, um Leute mit Ihrem Projekt einzurichten, da sie sudonicht benötigt werden. gulpDies bedeutet auch, dass die Version aktualisiert wird, wenn die Version in package.json gestoßen wird, sodass jeder bei der Entwicklung mit Ihrem Projekt dieselbe Version von gulp verwendet.

Nachtrag:

Es scheint, dass Gulp bei globaler Verwendung ein ungewöhnliches Verhalten aufweist. Bei Verwendung als globale Installation sucht gulp nach einem lokal installierten gulp, an den die Kontrolle übergeben werden kann. Daher erfordert eine globale gulp-Installation eine lokale gulp-Installation, um zu funktionieren. Die obige Antwort bleibt jedoch bestehen. Lokale Installationen sind globalen Installationen immer vorzuziehen.

qubyte
quelle
3
Ja, aber was ist, wenn Sie keinen Internetzugang haben? Wie können Sie gulp verwenden, wenn es nicht global installiert ist?
IGRACH
3
@IGRACH Das obige Skript verwendet keine Internetverbindung. Wenn Sie dasselbe tun möchten, ohne ein Skriptfeld in package.json zu verwenden, verwenden Sie ./node_modules/.bin/gulp.
Qubyte
1
Ich habe Aliase für definiert gulpund coffeedaher funktionieren die Befehle von meinem Knotenprojektstamm aus (z. B. alias gulp="node_modules/.bin/gulp"). Auf diese Weise sind die Befehle bei Bedarf einfach zu verwenden und es treten keine globalen / lokalen Versionskonflikte auf.
vesse
Danke @qubyte! Ich denke, die lokale Installation ist im Allgemeinen eine gute Vorgehensweise. Ich habe noch eine Frage, hoffe, Sie können mir helfen, meine Gedanken zu klären. Ich habe versucht, es global zu installieren, wie in Gulps Dokument vorgeschlagen, ohne es lokal zu installieren. Wenn ich versuche zu laufen gulp, wird die folgende Fehlermeldung angezeigt Local gulp not found in .... Soweit ich weiß, sollte es sich zuerst mit lokalen node_modules befassen, und wenn es nicht gefunden wird, sollte es sich dann mit global installierten Modulen befassen, nicht wahr? Vielen Dank!
Yeelan
1
Ein Nachtrag wurde hinzugefügt. Hoffentlich deckt das die Seltsamkeit des Schluckens ab.
Qubyte
82

TLDR; Hier ist der Grund :

Der Grund dafür ist, dass gulpversucht wird gulpfile.js, Ihre lokal installierte Version von auszuführen gulp(siehe hier) . Daher der Grund für eine globale und lokale Installation von gulp.

Wenn Sie gulpdas Skript lokal installieren, befindet es sich im Wesentlichen nicht in Ihrem PATHund Sie können daher nicht einfach eingeben gulpund erwarten, dass die Shell den Befehl findet. Durch die globale Installation gelangt das gulpSkript in Ihr Verzeichnis, PATHda sich das globale node/bin/Verzeichnis höchstwahrscheinlich auf Ihrem Pfad befindet.

Um Ihre lokalen Abhängigkeiten zu berücksichtigen, gulpverwenden Sie Ihre lokal installierte Version von sich selbst, um die auszuführen gulpfile.js.

Dwayne Crooks
quelle
1
~ / bin ist eine Unix-Konvention für Benutzer-Binärdateien und in PATH auf vielen Betriebssystemen standardmäßig. gulp sollte in der Lage sein, seine Binärdatei von dort aus zu verknüpfen.
Mikemaccana
2
Mit anderen Worten, Ihr global installiertes gulpPaket wird für die Eingabe node_modules/.bin/gulpdes Pfads benötigt. Speicher ist billig, aber MB für die Simulation eines Symlinks wegzuwerfen ist IMO reine Schlamperei.
14.
79

Sie können die global gulplokal installierten mit verknüpfen

npm link gulp
Berislav Lopac
quelle
1
Ich weiß, dass es am besten ist, lokale Installationen zu verwenden, aber es kann Fälle geben, in denen Sie es einfach nicht installieren können oder wollen (stellen Sie sich vor, auf Ihrem dedizierten CI-Server ist gulp global installiert und Sie installieren es bei jedem Commit neu). . Wie auch immer, +1 für die Erwähnung npm link.
gion_13
1
Ich sehe, was du dort getan hast. Das ist schlau.
Deepelement
Dies versucht nicht, die Frage zu beantworten
Mikemaccana
1
Nein, es macht es nur ungültig.
Berislav Lopac
67

Die Frage " Warum müssen wir gulp global und lokal installieren? " Kann in die folgenden zwei Fragen unterteilt werden:

  1. Warum muss ich gulp lokal installieren, wenn ich es bereits global installiert habe?

  2. Warum muss ich gulp global installieren, wenn ich es bereits lokal installiert habe?

Einige andere haben diese Fragen isoliert hervorragend beantwortet, aber ich dachte, es wäre vorteilhaft, die Informationen in einer einheitlichen Antwort zusammenzufassen.

Warum muss ich gulp lokal installieren, wenn ich es bereits global installiert habe?

Die Gründe für die lokale Installation von gulp bestehen aus mehreren Gründen:

  1. Durch das lokale Einbeziehen der Abhängigkeiten Ihres Projekts wird sichergestellt, dass die verwendete Version von gulp (oder anderen Abhängigkeiten) die ursprünglich beabsichtigte Version ist.
  2. Node berücksichtigt bei Verwendung von require () standardmäßig keine globalen Module (die Sie benötigen, um gulp in Ihr Skript aufzunehmen). Dies liegt letztendlich daran, dass der Pfad zu den globalen Modulen standardmäßig nicht zu NODE_PATH hinzugefügt wird.
  3. Laut dem Node-Entwicklungsteam werden lokale Module schneller geladen. Ich kann nicht sagen, warum dies so ist, aber dies scheint für die Verwendung des Knotens in der Produktion (dh Laufzeitabhängigkeiten) relevanter zu sein als in der Entwicklung (dh Entwicklungsabhängigkeiten). Ich nehme an, dies ist ein legitimer Grund, da sich einige vielleicht darum kümmern, welcher kleine Geschwindigkeitsvorteil beim Laden lokaler oder globaler Module erzielt wird. Sie können jedoch aus diesem Grund die Augenbrauen hochziehen.

Warum muss ich gulp global installieren, wenn ich es bereits lokal installiert habe?

  1. Der Grund für die globale Installation von gulp ist eigentlich nur die Bequemlichkeit, dass die ausführbare Datei von gulp automatisch in Ihrem Systempfad gefunden wird.

Um eine lokale Installation zu vermeiden, können Sie verwenden npm link [package], aber der Link-Befehl sowie der install --globalBefehl scheinen die --save-devOption nicht zu unterstützen, was bedeutet, dass es keine einfache Möglichkeit zu geben scheint, gulp global zu installieren und dann einfach die jeweilige Version hinzuzufügen Ihre lokale package.json-Datei.

Letztendlich halte ich es für sinnvoller, globale Module zu verwenden, um zu vermeiden, dass die Installation gemeinsamer Tools in all Ihren Projekten dupliziert werden muss, insbesondere bei Entwicklungstools wie Grunzen, Schlucken, Jshint usw. Leider Anscheinend kämpfst du ein bisschen gegen die Werkzeuge, wenn du gegen den Strich gehst.

Derek Greer
quelle
7
+1 für die erste Person im gesamten Internet, die darauf hinweist, dass die Frage zwei Punkte enthält. Fast jeder überall antwortet nur: "Warum muss ich gulp global installieren, wenn ich es bereits lokal installiert habe?" wann ich wissen wollte war "Warum muss ich gulp lokal installieren, wenn ich es bereits global installiert habe?".
Nathan JB
10
Die Tatsache, dass diese Frage einer so ausführlichen Erklärung bedarf, bedeutet, dass dies einfach keine sehr logische Arbeitsweise ist. Es sollte nicht erforderlich sein, für jedes Projekt immer wieder dasselbe Tool zu installieren.
Kokodoko
4
Ihre Antwort ist so schön emotionslos. Meins hätte 80% Schimpfwörter gehabt, da dies soo ******* dumm zu sein scheint. Aus Sicht der Werkzeuge ist die lokale Installationstheorie wahrscheinlich richtig, aber aus Sicht des Betriebssystems und des Paketmanagers ist dies so verrückt, dass ich keine Worte dafür finden kann. Welche Drogen nehmen die NPM / Schluck-Jungs?!? Wenn jemand anderer Meinung ist, lesen Sie bitte, wie Systempaket-Manager wie dpkg, yum, pacman und co. Arbeit.
JepZ
2
@JepZ es ist nur ein Schluck, der super komisch ist, es gibt nichts in Node oder Npm, was dies erzwingt. Und bestimmte Versionen von gulp im Projekt zu behalten, ist nur dann sinnvoll, wenn die gulp-Leute regelmäßig Patch-Versionen oder ähnliches brechen. Andere Build-Tools sind normalerweise eine globale Installation. Aber na ja. Nur hier zum Fluchen.
Stoffe
2
Es ist jetzt wirklich kein Problem, da die Community nur noch Garn verwendet :)
Derek Greer
8

Technisch gesehen müssen Sie es nicht global installieren, wenn sich der node_modulesOrdner in Ihrer lokalen Installation in Ihrem befindet PATH. Im Allgemeinen ist dies keine gute Idee.

Alternativ, wenn npm testReferenzen, gulpdann können Sie einfach eingeben npm testund es wird der lokale Schluck ausgeführt.

Ich habe gulp noch nie global installiert - ich denke, es ist eine schlechte Form.

Robrich
quelle
3
Besser als es in den Weg zu stellen, ist die Verwendung von NPM-Skripten
Jay
2

Ich bin mir nicht sicher, ob unser Problem direkt mit der Installation von gulp nur lokal zusammenhängt. Aber wir mussten selbst eine Reihe von Abhängigkeiten installieren. Dies führte zu einem "riesigen" package.json und wir sind uns nicht sicher, ob es wirklich eine gute Idee ist, gulp nur lokal zu installieren. Wir mussten dies aufgrund unserer Build-Umgebung tun. Aber ich würde nicht empfehlen, gulp nicht global zu installieren, wenn es nicht unbedingt notwendig ist. Wir hatten ähnliche Probleme wie im folgenden Blog-Beitrag beschrieben

Keines dieser Probleme tritt bei einem unserer Entwickler auf seinen lokalen Computern auf, da alle global gulp installiert haben. Auf dem Build-System hatten wir die beschriebenen Probleme. Wenn jemand interessiert ist, könnte ich tiefer in dieses Thema eintauchen. Aber im Moment wollte ich nur erwähnen, dass es kein einfacher Weg ist, gulp nur lokal zu installieren.

tschoartschi
quelle
Ja, bitte, tauchen Sie tiefer in dieses Thema ein.
Kenorb
1

Nur weil ich es hier nicht gesehen habe, wenn Sie unter MacOS oder Linux arbeiten, schlage ich vor, dass Sie dies Ihrem PFAD hinzufügen (in Ihrem Bashrc usw.):

node_modules/.bin

Mit diesem relativen Pfadeintrag können Sie, wenn Sie sich im Stammordner eines Knotenprojekts befinden, jedes Befehlszeilentool (eslint, gulp usw. usw.) ausführen, ohne sich um "globale Installationen" npm runusw. kümmern zu müssen .

Einmal habe ich noch nie ein Modul global installiert.

Elliot Nelson
quelle