Ich bin gerade dabei, eine CLI-Bibliothek von Ruby auf Node.js zu portieren. In meinem Code führe ich bei Bedarf mehrere Binärdateien von Drittanbietern aus. Ich bin mir nicht sicher, wie ich dies in Node am besten erreichen kann.
Hier ist ein Beispiel in Ruby, in dem ich PrinceXML aufrufe, um eine Datei in eine PDF-Datei zu konvertieren:
cmd = system("prince -v builds/pdf/book.html -o builds/pdf/book.pdf")
Was ist der entsprechende Code in Node?
javascript
ruby
node.js
command-line-interface
Dave Thompson
quelle
quelle
Antworten:
Für eine noch neuere Version von Node.js (v8.1.4) sind die Ereignisse und Aufrufe ähnlich oder identisch mit älteren Versionen, es wird jedoch empfohlen, die neueren Standard-Sprachfunktionen zu verwenden. Beispiele:
Verwenden Sie für gepufferte, nicht Stream-formatierte Ausgaben (Sie erhalten alles auf einmal)
child_process.exec
:Sie können es auch mit Versprechen verwenden:
Wenn Sie die Daten schrittweise in Blöcken empfangen möchten (Ausgabe als Stream), verwenden Sie
child_process.spawn
:Beide Funktionen haben ein synchrones Gegenstück. Ein Beispiel für
child_process.execSync
:Sowie
child_process.spawnSync
:Hinweis: Der folgende Code ist weiterhin funktionsfähig, richtet sich jedoch hauptsächlich an Benutzer von ES5 und früheren Versionen.
Das Modul zum Laichen untergeordneter Prozesse mit Node.js ist in der Dokumentation (v5.0.0) gut dokumentiert . Verwenden Sie Folgendes, um einen Befehl auszuführen und seine vollständige Ausgabe als Puffer abzurufen
child_process.exec
:Wenn Sie Handle-Prozess-E / A für Streams verwenden müssen, z. B. wenn Sie große Ausgabemengen erwarten, verwenden Sie
child_process.spawn
:Wenn Sie eine Datei anstelle eines Befehls ausführen, möchten Sie möglicherweise verwenden
child_process.execFile
, welche Parameter fast identisch sindspawn
, aber einen vierten Rückrufparameter haben, wieexec
zum Abrufen von Ausgabepuffern. Das könnte ein bisschen so aussehen:Ab Version 0.11.12 unterstützt Node jetzt synchrones
spawn
undexec
. Alle oben beschriebenen Methoden sind asynchron und haben ein synchrones Gegenstück. Die Dokumentation dazu finden Sie hier . Beachten Sie, dass die synchronen Methoden im Gegensatz zu den Methoden, mit denen untergeordnete Prozesse asynchron erzeugt werden, keine Instanz von zurückgeben, obwohl sie für die Skripterstellung nützlich sindChildProcess
.quelle
child.pipe(dest)
(was nicht existiert) müssen Siechild.stdout.pipe(dest)
und verwendenchild.stderr.pipe(dest)
, z . B.child.stdout.pipe(process.stdout)
undchild.stderr.pipe(process.stderr)
.echo "hello"
undecho "world"
.Knoten JS
v13.9.0
, LTSv12.16.1
undv10.19.0
--- März 2020Asynchrone Methode (Unix):
Asynchrone Methode (Windows):
Synchronisieren:
Aus der Node.js v13.9.0-Dokumentation
Gleiches gilt für die Dokumentation zu Node.js v12.16.1 und Node.js v10.19.0
quelle
'cmd', ['/c', 'dir']
. Zumindest habe ich nur hoch und niedrig gesucht, warum'dir'
ohne Argumente nicht funktioniert, bevor ich mich daran erinnerte ...;)Sie suchen nach child_process.exec
Hier ist das Beispiel:
quelle
data
Ereignisse auf Standardausgabe abhören . Schauen Sie in die Dokumente, aber es muss so etwas wie seinchildProc.stdout.on("data", fn)
.quelle
Seit Version 4 ist die nächste Alternative die
child_process.execSync
Methode:Beachten Sie, dass der
execSync
Aufruf die Ereignisschleife blockiert.quelle
child_process
bei der Verwendung ein Wesen geschaffenexecSync
? Und wird es direkt nach dem Befehl entfernt, richtig? Also keine Speicherlecks?Wenn Sie etwas wollen, das der Top-Antwort sehr ähnlich ist , aber auch synchron ist, funktioniert dies.
quelle
Ich habe gerade einen Cli-Helfer geschrieben, um einfach mit Unix / Windows umzugehen.
Javascript:
Typoskript-Originalquelldatei:
quelle
Jetzt können Sie shelljs (von Knoten v4) wie folgt verwenden:
quelle
Wenn Ihnen eine Abhängigkeit nichts ausmacht und Sie Versprechen verwenden möchten,
child-process-promise
funktioniert dies:Installation
exec Verwendung
Spawn-Nutzung
quelle
Verwenden Sie dieses leichte
npm
Paket:system-commands
Schau es dir hier an .
Importiere es so:
Führen Sie folgende Befehle aus:
quelle
Die Antwort von @ hexacyanide ist fast vollständig. Auf Windows - Befehl
prince
sein könnteprince.exe
,prince.cmd
,prince.bat
oder einfach nurprince
(ich bin nicht bewusst, wie Edelsteine gebündelt sind, aber npm Behälter werden mit einer sh Skript und einem Batch - Skript -npm
undnpm.cmd
). Wenn Sie ein portables Skript schreiben möchten, das unter Unix und Windows ausgeführt werden kann, müssen Sie die richtige ausführbare Datei erstellen.Hier ist eine einfache, aber tragbare Spawn-Funktion:
quelle