Was ist die korrekteste Methode zur Installation npm packages
in verschachtelten Unterordnern?
my-app
/my-sub-module
package.json
package.json
Was ist der beste Weg zu sein packages
in /my-sub-module
automatisch installiert werden , wenn npm install
einlaufen my-app
?
Antworten:
Wenn Sie einen einzelnen Befehl ausführen möchten, um npm-Pakete in verschachtelten Unterordnern zu installieren, können Sie ein Skript über
npm
und mainpackage.json
in Ihrem Stammverzeichnis ausführen . Das Skript besucht jedes Unterverzeichnis und wird ausgeführtnpm install
.Unten finden Sie ein
.js
Skript, mit dem das gewünschte Ergebnis erzielt wird:Beachten Sie, dass dies ein Beispiel aus einem StrongLoop- Artikel ist, der sich speziell mit einer modularen
node.js
Projektstruktur (einschließlich verschachtelter Komponenten undpackage.json
Dateien) befasst.Wie vorgeschlagen, können Sie dasselbe auch mit einem Bash-Skript erreichen.
BEARBEITEN: Der Code funktioniert unter Windows
quelle
Ich bevorzuge die Nachinstallation, wenn Sie die Namen des verschachtelten Unterverzeichnisses kennen. In
package.json
:quelle
"postinstall": "cd nested_dir2 && npm install"
für jeden Ordner?Laut der Antwort von @ Scott ist das Skript install | postinstall der einfachste Weg, solange die Namen der Unterverzeichnisse bekannt sind. So führe ich es für mehrere Unterverzeichnisse aus. Zum Beispiel so tun , als wir haben
api/
,web/
undshared/
Teilprojekte in einem monorepo root:quelle
( )
, um Unterschalen zu erstellen und zu vermeidencd api && npm install && cd ..
.npm install
auf der obersten Ebene"(cd was unexpected at this time."
Meine Lösung ist sehr ähnlich. Pure Node.js
Das folgende Skript untersucht alle Unterordner (rekursiv), solange sie vorhanden sind,
package.json
und wirdnpm install
in jedem von ihnen ausgeführt. Man kann Ausnahmen hinzufügen: Ordner dürfen nicht habenpackage.json
. Im folgenden Beispiel ist ein solcher Ordner "Pakete". Man kann es als "Preinstall" -Skript ausführen.quelle
Nur als Referenz für den Fall, dass Menschen auf diese Frage stoßen. Du kannst jetzt:
npm install --save path/to/my/subfolder
quelle
mkdir -p a/b ; cd a ; npm init ; cd b ; npm init ; npm install --save through2 ;
Warten Sie ... Sie haben Abhängigkeiten nur manuell in "b" installiert. Dies passiert nicht, wenn Sie ein neues Projekt klonen.rm -rf node_modules ; cd .. ; npm install --save ./b
. Listen Sie nun node_modules und dann b auf.Anwendungsfall 1 : Wenn Sie npm-Befehle in jedem Unterverzeichnis (wo sich jede package.json befindet) ausführen können, müssen Sie verwenden
postinstall
.Wie ich es
npm-run-all
sowieso oft benutze , benutze ich es, um es schön kurz zu halten (der Teil in der Nachinstallation):Dies hat den zusätzlichen Vorteil, dass ich alle auf einmal oder einzeln installieren kann. Wenn Sie dies nicht benötigen oder nicht
npm-run-all
als Abhängigkeit benötigen , lesen Sie die Antwort von demisx (unter Verwendung von Subshells in der Nachinstallation).Anwendungsfall 2 : Wenn Sie alle npm-Befehle aus dem Stammverzeichnis ausführen (und beispielsweise keine npm-Skripte in Unterverzeichnissen verwenden), können Sie einfach jedes Unterverzeichnis wie jede andere Installation installieren:
Im letzteren Fall wundern Sie sich nicht, dass Sie keine
node_modules
oder keinepackage-lock.json
Datei in den Unterverzeichnissen finden - alle Pakete werden im Stammverzeichnis installiertnode_modules
, weshalb Sie Ihre npm-Befehle nicht ausführen können Abhängigkeiten erfordern) aus einem Ihrer Unterverzeichnisse.Wenn Sie sich nicht sicher sind, funktioniert Anwendungsfall 1 immer.
quelle
run-p
ist nicht notwendig, aber es ist dann ausführlicher"postinstall": "npm run install:a && npm run install:b"
&&
ohne verwendenrun-p
. Aber wie Sie sagen, das ist weniger lesbar. Ein weiterer Nachteil (der durch run-p behoben wird, weil Installationen parallel ausgeführt werden) ist, dass bei einemHinzufügen von Windows-Unterstützung zu Snozzas Antwort sowie Überspringen des
node_modules
Ordners, falls vorhanden.quelle
Inspiriert von den hier bereitgestellten Skripten habe ich ein konfigurierbares Beispiel erstellt, das:
yarn
odernpm
yarn
aber nur ein Verzeichnis hat (standardmäßig true).package-lock.json
npm
cp.spawn
yarn workspaces
(konfigurierbar) gefunden wird.Und damit wird es verwendet:
quelle
Wenn Sie ein
find
Dienstprogramm auf Ihrem System haben, können Sie versuchen, den folgenden Befehl in Ihrem Anwendungsstammverzeichnis auszuführen:find . ! -path "*/node_modules/*" -name "package.json" -execdir npm install \;
Suchen Sie im Grunde alle
package.json
Dateien und führen Sie sienpm install
in diesem Verzeichnis aus, wobei Sie allenode_modules
Verzeichnisse überspringen .quelle
find . ! -path "*/node_modules/*" ! -path "*/additional_path/*" -name "package.json" -execdir npm install \;