Jestem w trakcie przenoszenia biblioteki CLI z Ruby na Node.js. W moim kodzie w razie potrzeby wykonuję kilka plików binarnych stron trzecich. Nie jestem pewien, jak najlepiej to osiągnąć w węźle.
Oto przykład w Ruby, w którym wywołuję PrinceXML w celu konwersji pliku do formatu PDF:
cmd = system("prince -v builds/pdf/book.html -o builds/pdf/book.pdf")
Jaki jest równoważny kod w węźle?
javascript
ruby
node.js
command-line-interface
Dave Thompson
źródło
źródło
Odpowiedzi:
W przypadku nowszej wersji Node.js (wersja 8.1.4) zdarzenia i wywołania są podobne lub identyczne jak w starszych wersjach, ale zaleca się korzystanie ze standardowych nowszych funkcji językowych. Przykłady:
W przypadku buforowanych, nie sformatowanych danych wyjściowych (otrzymujesz wszystko naraz), użyj
child_process.exec
:Możesz go również używać z Obietnicami:
Jeśli chcesz otrzymywać dane stopniowo we fragmentach (dane wyjściowe jako strumień), użyj
child_process.spawn
:Obie te funkcje mają synchroniczny odpowiednik. Przykład dla
child_process.execSync
:Jak również
child_process.spawnSync
:Uwaga: Poniższy kod jest nadal funkcjonalny, ale przede wszystkim jest przeznaczony dla użytkowników ES5 i wcześniejszych.
Moduł do odradzania procesów potomnych za pomocą Node.js jest dobrze udokumentowany w dokumentacji (v5.0.0). Aby wykonać polecenie i pobrać pełne dane wyjściowe jako bufor, użyj
child_process.exec
:Jeśli chcesz obsługiwać procesowe operacje we / wy ze strumieniami, na przykład gdy oczekujesz dużej ilości danych wyjściowych, użyj
child_process.spawn
:Jeśli wykonujesz plik zamiast polecenia, możesz użyć tego
child_process.execFile
, które parametry są prawie identycznespawn
, ale mają czwarty parametr wywołania zwrotnego, taki jakexec
do pobierania buforów wyjściowych. Może to wyglądać trochę tak:Od v0.11.12 Node obsługuje teraz synchroniczne
spawn
iexec
. Wszystkie metody opisane powyżej są asynchroniczne i mają synchroniczny odpowiednik. Dokumentację dla nich można znaleźć tutaj . Chociaż są one przydatne w skryptach, zauważ, że w przeciwieństwie do metod używanych do asynchronicznego odradzania procesów potomnych, metody synchroniczne nie zwracają instancjiChildProcess
.źródło
child.pipe(dest)
(który nie istnieje), trzeba użyćchild.stdout.pipe(dest)
ichild.stderr.pipe(dest)
, na przykładchild.stdout.pipe(process.stdout)
achild.stderr.pipe(process.stderr)
.echo "hello"
iecho "world"
.Węzeł JS
v13.9.0
, LTSv12.16.1
iv10.19.0
--- marzec 2020Metoda asynchroniczna (Unix):
Metoda asynchroniczna (Windows):
Synchronizacja:
Z dokumentacji Node.js v13.9.0
To samo dotyczy Dokumentacji Node.js v12.16.1 i Dokumentacji Node.js 10.19.0
źródło
'cmd', ['/c', 'dir']
. Przynajmniej szukałem wysoko i nisko, dlaczego'dir'
bez argumentów nie działa, zanim to sobie przypomniałem ...;)Szukasz child_process.exec
Oto przykład:
źródło
data
zdarzeń na standardowym wyjściu. Zajrzyj do dokumentacji, ale to musi być coś w rodzajuchildProc.stdout.on("data", fn)
.źródło
Od wersji 4 najbliższą alternatywą jest
child_process.execSync
metoda:Zauważ, że
execSync
pętla zdarzeń blokuje wywołanie.źródło
child_process
istota jest tworzona podczas używaniaexecSync
? I czy jest usuwany zaraz po wydaniu polecenia, prawda? Więc nie ma wycieków pamięci?Jeśli chcesz czegoś, co bardzo przypomina najwyższą odpowiedź, ale jest również synchroniczne, to zadziała.
źródło
Właśnie napisałem pomocnika Cli do łatwego radzenia sobie z Uniksem / oknami.
JavaScript:
Oryginalny plik źródłowy maszynopisu:
źródło
Teraz możesz używać shelljs (z węzła v4) w następujący sposób:
źródło
Jeśli nie masz nic przeciwko zależności i chcesz korzystać z obietnic,
child-process-promise
działa:instalacja
wykonanie Wykorzystanie
wykorzystanie spawn
źródło
Użyj tego lekkiego
npm
pakietu:system-commands
Spójrz na to tutaj .
Zaimportuj to w ten sposób:
Uruchom następujące polecenia:
źródło
Odpowiedź @ hexacyanide jest prawie kompletna. W Windows komenda
prince
może byćprince.exe
,prince.cmd
,prince.bat
lub po prostuprince
(nie jestem świadomy tego, jak kamienie są powiązane, ale KMP Pojemniki wyposażone są w skrypcie sh i skryptu wsadowego -npm
inpm.cmd
). Jeśli chcesz napisać przenośny skrypt, który działałby w systemach Unix i Windows, musisz odrodzić odpowiedni plik wykonywalny.Oto prosta, ale przenośna funkcja spawnowania:
źródło