Эквивалент Рейка 'sh' для Джейка? - PullRequest
0 голосов
/ 19 марта 2012

У меня есть некоторый опыт работы с 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);

1 Ответ

0 голосов
/ 19 марта 2012

Вот код, который я придумал, который, кажется, работает хорошо.(Но если у кого-то есть лучший ответ или он знает о существующем модуле npm, который уже делает это, добавьте еще один ответ.)

  • Поддерживает полный синтаксис оболочки, поэтому вы можете использовать | и < и > для передачи и перенаправления вывода, вы можете запускать пакетные файлы Windows и т. Д.
  • Отображает вывод (как STDOUT, так и STDERR) по мере того, как его генерирует дочерний процесс, поэтому вы видите инкрементный вывод в качестве командывыполняется.
  • Нет ограничений на количество выходных данных, которые может генерировать команда (в отличие от предыдущей версии этого кода на основе exec).
  • Кроссплатформенная (работает в Windows, должна работатьна Mac / Linux также).Я позаимствовал технику для платформы-оболочки (if platform === 'win32') у npm .

Вот код:

function sh(command, callback) {
  var shell = '/bin/sh', args = ['-c', commandLine], child;
  if (process.platform === 'win32') {
    shell = 'cmd';
    args = ['/c', commandLine];
  }
  child = child_process.spawn(shell, args);
  child.stdout.pipe(process.stdout);
  child.stderr.pipe(process.stderr);
  child.on('exit', function(code, signal) {
    if (signal != null)
      throw new Error("Process terminated with signal " + signal);
    if (code !== 0)
      throw new Error("Process exited with error code " + code);
    callback();
  });
};
...