Ich habe eine ähnliche Frage zu diesem , aber nicht ganz dasselbe.
Ich möchte, dass der Benutzer meiner App sie mit den Abhängigkeiten installiert, die für die Art und Weise erforderlich sind, wie er sie verwenden möchte. Wenn sie beispielsweise in MongoDB bleiben möchten, werden nur Bibliotheken mit Bezug zu Mongo installiert. Wenn sie jedoch in Redis bleiben möchten, werden nur Bibliotheken mit Bezug zu Redis installiert. Ich möchte nicht, dass sie Bibliotheken herunterladen und installieren, die sie nicht verwenden.
Ich weiß, dass ich das für Entwicklungszwecke mit machen kann devDependencies
, aber das geht noch weiter. Wie die Antwort in der obigen Frage besagt, hängt dies enger mit setuptools
extras_require
den leiningen
Profilen von Python und Clojure zusammen . Sowas in npm? Ich bin wirklich der Meinung, devDependencies
dass es ein dev
Profil für eine vielseitigere Art der Spezifizierung von Abhängigkeiten sein sollte.
quelle
MyPackage-Core
MyPackage-Db-Mongo
MyPackage-Db-Redis
usw ... so wie die Leute Laubenmodule bauen , die dazu gedacht sind , eckige Module zu erweitern .package.json
ist, die in anderen Paketmanagern behoben wurde.Antworten:
Das Codependenzmodul ist möglicherweise das, wonach Sie suchen, oder alles, was etwas Ähnliches bewirkt wie:
package.json
die nicht werden , indem es automatisch installiertnpm install
, sagen wiroptionalPeerDependencies
require
Funktion,optionalPeerDependencies
die das Richtige kennt und tut, einschließlich Werfen / Warnen, wenn nichts gefunden wird, das eine erforderliche Klasse von Modulen erfüllt (z. B. sind wederredis
nochmongo
nochmysql
usw. installiert).Eine Variation wäre, wenn die Kernfunktionalität des Moduls ohne optionale Abhängigkeiten (z. B. Plugin-Muster) funktioniert, kein Fehler / Warnung, wenn nichts gefunden wird, das eine Peer-Abhängigkeit erfüllt.
Eine andere Variante ist die oben aufgeführte Liste, bei der die Produktions- und Entwicklungsabhängigkeiten berücksichtigt werden, dh eine analoge für
dependencies
unddevDependencies
.Möglicherweise kombiniert mit einer On-Demand-Anforderung, sodass optionale Module träge benötigt werden, z. B .:
quelle
codependency
Modul für den Fall bietet, dass das Modul aus dem NPM verdampft und Links ohne Auszüge eine schlechte SO-Form haben.Wenn Sie einfache optionale Abhängigkeiten wie Plugins möchten, z. B. wenn Sie foo installieren, werden Sie es bunt ausführen, aber wenn es nicht installiert ist, haben Sie kein Problem und sehen es grau, dann können Sie optionalDependecies in der package.json verwenden :
Und im Code:
Aus der package.json-Dokumentation extrahiert .
quelle
Ich konfiguriere ein Installationsskript in meinem package.json
scripts
wie folgt :Es wird direkt nach dem
npm install
Ende ausgeführt. Ich benutze es hauptsächlich zum automatischen Generieren einer.env
Datei mit Standardeinstellungen.Das
my-install.js
Skript kann verschiedene Befehle ausführen, Dateien erstellen und nach Benutzereingaben fragen, sodass Sie "Want Redis or Mongo?" Sagen können:Dies ist eine sehr schnelle Antwort. Lesen Sie die Readline, um Benutzereingaben richtig zu lesen, und den Child-Prozess, um Befehle auszuführen und Ausgaben zu verarbeiten usw.
Beachten Sie auch, dass das Installationsskript beliebig sein kann (Python, Bash usw.).
quelle
npm install
erneute Ausführen innerhalb eines Installationsskripts kann ebenfalls ein unbeabsichtigtes Verhalten auslösen. Ich empfehle diese Lösung nicht.npm war wirklich nicht dafür ausgelegt, da einer der schwierigsten Teile des Abhängigkeitsmanagements darin besteht, schnelle, reproduzierbare Builds zu gewährleisten, die einfach und relativ ausfallsicher sind. Aber ich glaube, es gibt einen Anwendungsfall, und der war mit Sicherheit für mich. Also habe ich ein Paket geschrieben, um genau das zu tun, wonach du fragst.
Mein Paket ist
install-subset
und kann global mit installiert werdennpm install -g install-subset
https://www.npmjs.com/package/install-subset
Zunächst erstellen Sie Whitelists und Blacklists für benannte Installations-Subsets in Ihrer package.json wie folgt:
Rufen Sie es dann zum Beispiel mit
install-subset test
Dadurch wird die Datei package.json vorübergehend neu geschrieben, sodass diese Pakete nicht auf der schwarzen Liste installiert und anschließend wiederhergestellt werden. Dies kann je nach Paket viel Zeit und Bandbreite sparen.
Arbeitet auch mit Garn, ist Open Source und Fragen / PRs sind willkommen.
In vielen Fällen verwende ich dies auf unserem ci-Server, um die Erstellungszeit zu verkürzen, und bei unserem neuesten React Native-Projekt dauerte die typische Installation neuer Entwickler von 72 Sekunden auf etwa 20 Sekunden.
quelle