Ausführen von npm `postinstall` script nach dem original `npm install` endet? (Vielleicht durch die Verwendung eines Knoten-trick?)
Ich versuche zu schaffen, ein npm-Modul, das mit einem postinstall
- Skript, das ändern des Benutzers package.json
- und re-installieren von Paketen. Ich bin fast da, aber das problem das ich habe ist, dass die npm-CLI läuft mein postinstall
Skript zu früh.
Gibt es eine Möglichkeit, vielleicht durch die mithilfe von Knoten-oder system-level-trick, zu warten, für die ganze npm install
Prozess zu beenden, bevor mein Skript ausgeführt wird? Wie bei npm ruft meine postinstall
Skript, in dieser Zeit kann ich mich anmelden ein script ausgeführt wird, nach der npm install
endet?
Was meine ich mit "zu früh"? Zum Beispiel, nach yarn install
, die yarn.lock
Datei wird nicht genau der package.json
wenn mein script stört yarn install
. Jedoch, wenn mein Skript wartet, bis yarn install
komplett fertig stellen und dann läuft ein weiteres yarn install
, die yarn.lock
Datei genau und weitere yarn install
Befehle output "Bereits up-to-date".
- Bitten Sie den Benutzer, ein Skript ausführen, die erste ruft
npm install
und ruft dann IhrepostInstall
Skript? - können Sie nach Ihrem Paket.json
- Dies ist die neueste mit hat die änderungen, die jervtub vorgeschlagen unpkg.com/[email protected]/package.json
- was ist Ihre npm-und Knoten-Versionen ?
- npm 4.5.0-und Knoten-6.10.2.
- Ich denke, man könnte eher sein, suchen für hook-Skripte; siehe docs.npmjs.com/misc/scripts#hook-scripts
- Also wenn ich das richtig verstehe, Sie möchten, verwenden Sie den Paket.json aktualisieren "von selbst" und dann führen Sie sich wieder? (Kein Wortspiel beabsichtigt)
- Ps. Ich würde die Nüsse gehen, wenn ich eine npm-Paket und würde es Bearbeiten mein Paket.json. Das Ding ist heilig, man kann Sie nicht Durcheinander herum gibt.
- Würde es nicht ändern Sie Ihre
package.json
es sei denn, Sie ging durch die Probleme mit der Konfiguration Ihrespackage.json
speziell für die Arbeit mit diesem Paket, das würden Sie nicht tun, es sei denn, Sie haben verstanden, wie das Paket funktioniert. - hast du eine Lösung finden?, Ich habe die gleiche Anforderung haben, bitte lassen Sie mich wissen,
- NÖ, war nicht in der Lage, eine Lösung zu finden. Landete nach einem komplett anderen Ansatz für mein Ziel erreichen.
- cool, ich habe auch herauszufinden, etwas, vielen Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Angesichts Manipulation direkt mit der Paket.json ist eine schlechte Praxis, weil die Devs nicht mehr die Kontrolle über die Pakete, die Sie installiert haben, oder sogar Ihren Namen für das Projekt.
Daher sollten Pakete fordern stattdessen die Dev zu ändern Paket.json während der installation und bieten eine Methode, damit Entwickler für ein dry-run der änderungen, die vorgenommen werden.
TLDR; stellen Sie sicher, dass die volle Zustimmung zu der Dev für Manipulationen der Paket.json.
Deshalb finde ich alternative Methoden sind besser, als mit einem postinstall-script. Die minimal-Lösung, die ich mit gekommen:
myinstall.js
Paket.json
Legen Sie die
mypostinstall
Skript gleich diepostinstall
.Hinweis: im Beispiel oben gibt es keine Fehlerbehandlung, wird kein text angezeigt und es gibt keine eigentliche schreiben der Paket.json. Es ist rein zur illustration, wie das ausführen von code nach
npm install
. Der Grund ist kein text angezeigt wird, wird durch Aufrufexec
, für die ein neues Verfahren genannt, mit seinem "persönlichen" stdout. Nutzen Sie alternativfork
mehr info finden Sie hier an den Knoten Dokumentation.Habe ich versucht zu rufen
npm install
stattnpm run myinstall
durch Einstellung"install": "node myinstall.js"
. Aber nun derexec('npm run install')
wird rekursiv sich selbst aufrufen.npm install
oderyarn install
. Ich will nicht den Benutzer auffordern, führen Sie einen alternativen Befehl. Die Art, wie ich behandelt mit der rekursive Aufruf ist, indem SiemyInstall=attempted npm install
und wenn diemyInstall
env-variable vorhanden ist, die ich nicht nennennpm install
rekursiv. Wenn wir etwas ähnliches tun mit Ihrer Lösung können wir ein Skript, das ausgeführt wird, nachdem der Benutzer initiierte plainnpm install
vollständig abgeschlossen hat?postinstall
Skript, da npm wird dieses Skript aufrufen, automatisch, während wir möchten, rufen Sie das Skript manuell. Zum Beispiel, benennen Siepostinstall
zumypostinstall
. Auch, vergessen Sie nicht, rufennpm run mypostinstall
wenn diemyInstall
env vorhanden ist.yarn add commonpkg
, danach muss der code ausgeführt werden?commonpkg
imdevDependencies
des Benutzers. Jetzt wird der Benutzer nichtyarn install
in Ihrem Paket, und das ist der Befehl, nach dem ich möchte, dass meinepostinstall
Skript ausgeführt werden.postInstall
als Sie herausgefunden haben, hat Sie sehr ungewöhnliche Art und Weise der Ausführung und verbuggt in einigen Versionen von npm (alle pre npm 3) , Dieser wurde behoben, die in den späteren Versionen Also zu aller erst sicherstellen, dass Ihr npm version up to date ist; Wenn es ist, haben Sie 2 Möglichkeiten, die ich Ihnen geben kann, aus der Spitze von meinem Kopf,Option 1
Dies ist die einfachste Lösung, dieses Skript verwenden, es ist ziemlich selbsterklärend, es wird alles installieren und um auf der sicheren Seite geben, die nach der Installation mal wieder zu sehen. Nicht die ideale Lösung aber es sollte funktionieren ohne Probleme.
Option 2
Versuchen Sie, Ihre
devDependencies
zudependencies
wenn möglich, für einige Benutzer diese scheinen zu beheben, diepostInstall
Problem. Aber ich empfehle es nichtdevDependencies
gibt es für einen Grund.UPDATE
Ok, ich bekomme das Problem jetzt, aber es sollte abgedeckt werden, mit einer leichten variation auf die option 1 aus dem Skript. Da Ihr postinstall-Skript kann schon Griff die Umbau-und re-installation.
postinstall
Skript von meinem Modul zu laufen, wenn ein Benutzer die Installation meines Pakets. Es ist nicht für mein eigenes Paket.