Я в процессе переноса библиотеки CLI из Ruby в Node.js. В моем коде я выполняю несколько сторонних двоичных файлов, когда это необходимо. Я не уверен, как лучше всего это сделать в Node.
Вот пример в Ruby, где я вызываю PrinceXML для преобразования файла в PDF:
cmd = system("prince -v builds/pdf/book.html -o builds/pdf/book.pdf")
Каков эквивалентный код в Node?
javascript
ruby
node.js
command-line-interface
Дэйв Томпсон
источник
источник
Ответы:
Для еще более новой версии Node.js (v8.1.4) события и вызовы аналогичны или идентичны более старым версиям, но рекомендуется использовать стандартные новые языковые функции. Примеры:
Для буферизованного вывода без форматирования потока (вы получаете все сразу) используйте
child_process.exec
:Вы также можете использовать его с Обещаниями:
Если вы хотите получать данные постепенно порциями (выводить в виде потока), используйте
child_process.spawn
:Обе эти функции имеют синхронный аналог. Пример для
child_process.execSync
:А также
child_process.spawnSync
:Примечание . Следующий код все еще работает, но в первую очередь предназначен для пользователей ES5 и более ранних версий.
Модуль для порождения дочерних процессов с Node.js хорошо документирован в документации (v5.0.0). Чтобы выполнить команду и получить ее полный вывод в виде буфера, используйте
child_process.exec
:Если вам нужно использовать процессный ввод-вывод с потоками, например, когда вы ожидаете больших объемов вывода, используйте
child_process.spawn
:Если вы выполняете файл, а не команду, вы можете использовать
child_process.execFile
, параметры которого почти идентичныspawn
, но имеют четвертый параметр обратного вызова, например,exec
для получения выходных буферов. Это может выглядеть примерно так:Начиная с v0.11.12 , Node теперь поддерживает синхронные
spawn
иexec
. Все описанные выше методы являются асинхронными и имеют синхронный аналог. Документацию для них можно найти здесь . Хотя они полезны для сценариев, обратите внимание, что в отличие от методов, используемых для асинхронного порождения дочерних процессов, синхронные методы не возвращают экземплярChildProcess
.источник
child.pipe(dest)
(которого не существует) вы должны использоватьchild.stdout.pipe(dest)
иchild.stderr.pipe(dest)
, например,child.stdout.pipe(process.stdout)
иchild.stderr.pipe(process.stderr)
.echo "hello"
иecho "world"
.Узел JS
v13.9.0
, LTSv12.16.1
иv10.19.0
--- Март 2020Асинхронный метод (Unix):
Асинхронный метод (Windows):
Синхронизация:
Из документации Node.js v13.9.0
То же самое относится и к Node.js v12.16.1 документации и Node.js v10.19.0 документации
источник
'cmd', ['/c', 'dir']
. По крайней мере, я просто искал высоко и низко, почему'dir'
без аргументов не работает, прежде чем я запомнил это ...;)Вы ищете child_process.exec
Вот пример:
источник
data
события на стандартном выводе. Посмотрите в документах, но это должно быть что-то вродеchildProc.stdout.on("data", fn)
.источник
Начиная с версии 4, наиболее близким вариантом является
child_process.execSync
метод:Обратите внимание, что
execSync
вызов блокирует цикл обработки событий.источник
child_process
Создано ли существо при использованииexecSync
хотя? И удаляется ли он сразу после команды, верно? Так нет утечек памяти?Если вы хотите что-то похожее на верхний ответ, но также синхронный, то это будет работать.
источник
Я только что написал помощник Cli, чтобы иметь дело с Unix / Windows легко.
Javascript:
Машинопись оригинального исходного файла:
источник
Если вы не против зависимости и хотите использовать обещания,
child-process-promise
работает:установка
Exec Usage
использование икры
источник
Теперь вы можете использовать shelljs (из узла v4) следующим образом:
источник
Используйте этот легкий
npm
пакет:system-commands
Посмотри на это здесь .
Импортируйте это так:
Запустите такие команды:
источник
Ответ @ hexacyanide почти полный. В Windows команда
prince
может бытьprince.exe
,prince.cmd
,prince.bat
или простоprince
(я не в курсе , как драгоценные камни в комплекте, но НПЕ контейнеры поставляются с скриптом ш и пакетным сценарием -npm
иnpm.cmd
). Если вы хотите написать переносимый скрипт, который будет работать в Unix и Windows, вам нужно создать подходящий исполняемый файл.Вот простая, но переносимая функция spawn:
источник