У меня есть некоторый опыт работы с Ruby и Rake , но сейчас я работаю над проектом Node и хочу узнать, как это сделать. то же самое с Джейк .
В Ruby есть функция system
, которая будет передаваться команде и ждать ее завершения. Rake расширяет это, добавляя функцию sh
, которая дополнительно выдает ошибку, если дочерний процесс возвратил ненулевой код выхода (или его не удалось найти вообще). sh
действительно удобен для задач Rake, которые распространяются на такие вещи, как компиляторы или тестовые фреймворки, потому что он автоматически завершает задачу, как только происходит сбой.
Узел, похоже, не имеет ничего подобного system
или sh
- похоже, что ближайшие эквиваленты child_process.spawn
и child_process.exec
, но ни из них подключается STDOUT или STDERR, поэтому вы не можете видеть никаких выходных данных дочернего процесса, если не выполните дополнительную работу.
Какой лучший способ получить метод sh
для Джейка? (Хотя, поскольку это Node, я бы ожидал, что он будет асинхронным, а не блокированным, пока команда не вернется, как это делает Ruby.) Есть ли модуль npm, который уже изобрел это конкретное колесо, или у кого-то есть пример кода, который делает это?
Я уже видел sh.js , но он выглядит очень тяжеловесным для этого (он пытается построить весь командный интерпретатор в Node), и он не выглядит как асинхронный (хотя документы не говорят так или иначе).
Я ищу что-то, что я мог бы использовать более или менее так (используя поддержку Джейка для асинхронных задач ):
file('myprogram', ['in.c'], function() {
// sh(command, args, successCallback)
sh('gcc', ['in.c', '-o', 'myprogram'], function() {
// sh should throw if gcc couldn't be found or returned nonzero.
// So if we got here, we can tell Jake our task completed successfully.
complete();
});
}, true);