wake-up-neo.com

Npm `postinstall`-Skript ausführen, nachdem die ursprüngliche` npm install` abgeschlossen ist? (Vielleicht mit einem Knotentrick?)

Ich versuche, ein npm-Modul zu erstellen, das über ein postinstall-Skript verfügt, mit dem der package.json des Benutzers geändert und die Pakete erneut installiert werden. Ich bin fast da, aber das Problem, das ich habe, ist, dass die npm-CLI mein postinstall-Skript zu früh ausführt.

Gibt es eine Möglichkeit, etwa durch Verwendung eines Knotens oder eines Tricks auf Systemebene, um zu warten, bis der gesamte npm install-Prozess beendet ist, bevor mein Skript ausgeführt wird? Wenn npm beispielsweise mein postinstall-Skript aufruft, kann ich zu diesem Zeitpunkt ein anderes Skript registrieren, das ausgeführt wird, nachdem npm install beendet ist.

Was meine ich mit "zu früh"? Zum Beispiel wird nach yarn install die yarn.lock-Datei den package.json nicht genau wiedergeben, wenn mein Skript yarn install stört. Wenn mein Skript jedoch darauf wartet, dass yarn install vollständig fertiggestellt ist, und dann einen anderen yarn install ausführt, ist die yarn.lock-Datei korrekt und weitere yarn install-Befehle geben "Bereits aktuell" aus.

16
M.K. Safi

Die Manipulation von Manipulationen direkt an package.json ist eine schlechte Praxis, da die Devs nicht mehr die Kontrolle über die von ihnen installierten Pakete oder ihren Projektnamen haben.

Daher sollten Pakete stattdessen den Dev auffordern, package.json während der Installation zu ändern, und eine Methode anbieten, mit der Devs für einen Trockenlauf der vorgenommenen Änderungen aktiviert wird.

TLDR; Stellen Sie sicher, dass Sie dem Entwickler für jede Manipulation des package.json vollständig zustimmen.

Deshalb halte ich alternative Methoden für besser als ein Postinstall-Skript. Die minimalste Lösung, die ich mir ausgedacht habe:

myinstall.js

const exec = require('child_process').exec;
exec('npm run install').on('exit', () => exec('npm run mypostinstall'));

package.json

"scripts": {
  "myinstall": "node myinstall.js",
  "mypostinstall": "echo \"myPostinstall called\""
},

Setzen Sie das Skript mypostinstall gleich der Variable postinstall.

Hinweis: Im obigen Beispiel gibt es keine Fehlerbehandlung, es wird kein Text angezeigt und es wird kein Schreibvorgang für package.json ausgeführt. Es ist rein zur Veranschaulichung, wie Code nach npm install ausgeführt werden soll. Der Grund, warum kein Text angezeigt wird, ist der Aufruf von exec, für den ein neuer Prozess mit seinem "persönlichen" stdout aufgerufen wird. Alternativ verwenden Sie fork, weitere Informationen finden Sie hier in der Knotendokumentation.

Ich habe versucht, npm install anstelle von npm run myinstall aufzurufen, indem Sie "install": "node myinstall.js" einstellen. Nun wird sich die exec('npm run install') rekursiv selbst aufrufen.

3
jervtub

Wie Sie herausgefunden haben, hat postInstall eine sehr ungewöhnliche Art der Ausführung und Fehler in einigen Versionen von npm (alle vor npm 3). Dies wurde in den späteren Versionen behoben. Stellen Sie also zunächst sicher, dass Ihre npm-Version auf dem neuesten Stand ist. Wenn Sie zwei Optionen haben, die ich Ihnen aus meinem Kopf geben kann,

Option 1  

Dies ist die einfachste Lösung, verwenden Sie dieses Skript, es ist ziemlich selbsterklärend, es wird alles installiert und um sicherzugehen, geben Sie der Post-Installation eine einmalige Installation. Nicht die idealste Lösung, aber es sollte ohne Probleme funktionieren. 

#!/bin/bash
npm install
npm run postinstall

Option 2

Versuchen Sie, Ihre devDependencies nach dependencies zu verschieben, falls dies möglich ist. Für einige Benutzer scheint dies das Problem postInstall zu beheben. Aber ich empfehle es nicht devDependencies gibt es aus einem bestimmten Grund. 

UPDATE

Ok, ich bekomme das Problem jetzt, aber es sollte mit einer geringfügigen Variation des Skripts der Option 1 abgedeckt werden. Da Ihr Postinstall-Skript die Änderung und Neuinstallation bereits durchführen kann. 

#!/bin/bash
npm install
cd (<path to your modue> && npm run postinstall)
0
Kalana Demel