Wie kann ich mehrere Projekte dazu bringen, das Verzeichnis node_modules gemeinsam zu nutzen?


90

Wenn ich Projekte mache, muss ich alle Abhängigkeiten von Knotenmodulen herunterladen. Gibt es ohne Kopieren der node_modules überhaupt eine Möglichkeit, die zentralen node_modules in mehreren Projekten freizugeben?

Wie im Folgenden muss ich jedes Mal viele Befehle ausführen.

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html

3
Sie können sie in einem gemeinsamen übergeordneten Verzeichnis installieren, sofern vorhanden. Der Knoten durchsucht die Verzeichnisse nach dem required-Modul. Andernfalls gibt es keinen offiziellen "zentralen" node_modulesOrdner zur Verwendung mit require().
Jonathan Lonowski

Sie können diese Pakete mithilfe des globalen Flags global installieren. Sie müssen also nicht jedes Mal Installationsbefehle ausführen. npm install <npm_package_name> -g
Saba Hassan

Antworten:


87

Sie können ein node_modules-Verzeichnis absolut für Projekte freigeben.

Aus der Dokumentation des Knotens :

Wenn die an require () übergebene Modulkennung kein natives Modul ist und nicht mit '/', '../' oder './' beginnt, beginnt der Knoten im übergeordneten Verzeichnis des aktuellen Moduls und fügt hinzu / node_modules und versucht, das Modul von diesem Speicherort zu laden.

Wenn es dort nicht gefunden wird, wird es in das übergeordnete Verzeichnis usw. verschoben, bis das Stammverzeichnis des Dateisystems erreicht ist.

Wenn beispielsweise die Datei unter '/home/ry/projects/foo.js' mit dem Namen require ('bar.js') aufgerufen wird, wird der Knoten an den folgenden Speicherorten in dieser Reihenfolge angezeigt:

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

Legen Sie einfach einen Ordner node_modules in Ihr Projektverzeichnis und fügen Sie die gewünschten Module ein. Benötigen Sie sie einfach wie normal. Wenn node kein Verzeichnis node_modules in Ihrem Projektordner findet, überprüft es automatisch den übergeordneten Ordner. Machen Sie Ihre Verzeichnisstruktur also so:

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

Auf diese Weise können auch die Abhängigkeiten Ihres Unterprojekts auf Ihr Hauptrepository für node_modules zurückgreifen.

Ein Nachteil auf diese Weise ist, dass Sie Ihre package.json-Datei manuell erstellen müssen (es sei denn, jemand kennt eine Möglichkeit, dies mit Grunzen oder Ähnlichem zu automatisieren). Wenn Sie Ihre Pakete installieren und das Argument --save zu einem npm installBefehl hinzufügen, wird es automatisch an den Abschnitt "Abhängigkeiten" oder an "package.json" angehängt, was praktisch ist.


2
Warum wird dies nicht als Antwort akzeptiert? Weitere Frage an @tpie: Sollte man ein Projekt wie von Ihnen vorgeschlagen strukturieren, wie würde man die package.json erstellen, um sie aus dem übergeordneten Modul-Repository zu installieren.
Diehell

@diehell Es scheint also "alles oder nichts" zu sein. Wenn alle oder Abhängigkeiten in einem übergeordneten Verzeichnis gespeichert sind und im CWD kein Verzeichnis node_modules vorhanden ist, überprüft npm das übergeordnete Verzeichnis und installiert es dort, wenn es es findet. Wenn Sie einen Ordner node_modules in das Verzeichnis legen, wird er dort installiert.
tpie

4
Ich sehe nicht, wie die Freigabe von node_modules mit verschiedenen Paketversionen umgehen kann. Die Pakete in node_modules sind nicht versioniert, im Gegensatz zum npm-Cache in c: \ users (Windows). Ist jemand darauf gestoßen?
Cyberguest

Wie würde ich mein Paradigma ändern, wenn ich npm-Skripte und package.json-Dateien schreibe?
Maddocks

17

Ich habe einen Trick gefunden. Schauen Sie sich einfach die symbolischen Links (Symlinks) unter Windows oder Linux an . Sie funktionieren wie Verknüpfungen, sind jedoch leistungsfähiger.

Sie müssen einfach einen Ordner Junctionfür Ihren node_modulesOrdner erstellen, wo immer Sie möchten. Die Junction ist nichts anderes als eine Verknüpfung zu Ihrem ursprünglichen Ordner node_modules. Erstellen Sie es in Ihrem Projektordner, in dem die tatsächlichen node_modules erstellt worden wären, wenn sie verwendet worden wärennpm install .

Um dies zu erreichen, benötigen Sie mindestens einen node_modulesechten Ordner und erstellen in den anderen Projekten eine Junction.

Unter Windows können Sie entweder die Eingabeaufforderung oder eine Anwendung verwenden. Die Verwendung der Eingabeaufforderung gibt Ihnen ein bisschen mehr Kontrolle. Die Verwendung einer Anwendung ist einfacher. Ich schlage vor, die Link Shell-Erweiterung .


1
Ich cd zum Zielverzeichnis, führen Sie diesen Befehl aus : mklink /d node_modules (source dir)\node_modules.
ChrisTorng

1
Mein Team verwendet diese Methode seit einiger Zeit. Obwohl ich es wirklich verachte, nicht node_modulesim Projektordner selbst zu sein, funktioniert dies. Ich muss nur daran denken, zum eigentlichen node_modulesOrdner zu
navigieren,

Diese Methode scheint bei mir nicht zu funktionieren. Wenn ich entweder symbolische oder Junctions verwende, wird bei node-sass der folgende Fehler angezeigt: Modulerstellung fehlgeschlagen: "Fehler: Modul hat sich nicht selbst registriert" und der Fehler enthält weitere Details, die das Verzeichnis angeben, in dem das Verzeichnis "shared" node_modules vorhanden ist. Irgendwelche Ideen?
Flipcode

1
Wie vermeide ich das Bereinigen von Abhängigkeiten, wenn ich npm installin einer der "verbundenen" Apps ausgeführt werde?
Qwerty

Dieses Ding funktioniert sehr gut. Bei anderen Methoden haben meine npm-Skripte nicht funktioniert, aber es funktioniert dafür.
Rohit Kaushal

14

Versuchen Sie pnpm anstelle von npm.

pnpm verwendet Hardlinks und Symlinks, um eine Version eines Moduls nur einmal auf einer Festplatte zu speichern.

Installieren mit:

npm install -g pnpm

Verwenden Sie zum Aktualisieren Ihrer vorhandenen Installationen (und Unterverzeichnisse):

pnpm recursive install

8

Das Hauptverzeichnis sollte so aussehen

node_modules
Project 1
Project 2
Project 3
Project 4

Öffnen Sie einfach die Datei Project 1/.angular-cli.json

Ändern Sie das Schema

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

zu

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

und vergessen Sie nicht, einen node_modulesleeren Ordner in Ihrem Projektverzeichnis zu erstellen


Sie sind mein Held. Ich habe eine Woche damit verbracht . Ich danke dir sehr!!
Eliezer Berlin

5

In einigen Artikeln scheint Lerna ein gutes Werkzeug für die Verwaltung mehrerer Projekte in einem einzigen Verzeichnis zu sein ( monorepo). Es unterstützt die gemeinsame Nutzung von Modulen, ohne die gesamten Pakete in jedem Ordner zu duplizieren, und Befehle, um sie in mehreren Projekten zu installieren.

pnpm ist auch ein einfaches und effizientes Tool, das die Module, die bereits für andere Projekte installiert sind, nicht dupliziert.


0

Nehmen wir an, dass ein einzelnes node_modules alle Pakete für alle Anwendungen enthalten sollte. Daher teilen Ihre Apps auch die meisten eindeutigen package.json-Einträge (nur der Name sollte sich ändern).

Meine Idee wäre, eine einzelne Wurzel und mehrere src-Ebenen wie unten zu haben

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

Das einzige Problem, mit dem Sie möglicherweise konfrontiert werden, besteht darin, eine Sicherungskopie von json (oder tsconfig) für eine App zu erstellen und diese wiederherzustellen, wenn Sie daran arbeiten oder Ihre Startskripte für die Bereitstellung einer App einrichten

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.