Node.js и Джейк - Как синхронно вызывать системные команды внутри задачи? - PullRequest
5 голосов
/ 20 июля 2011

Задача Джейка выполняет длительную системную команду.Другая задача зависит от того, что первая задача полностью завершена перед началом.Функция 'exec' child_process 'выполняет системные команды асинхронно, что позволяет запустить второе задание до завершения первого.

Какой самый чистый способ написания Jakefile, чтобы гарантировать, что длинный-running системная команда в первой задаче заканчивается до запуска второй?

Я думал об использовании опроса в фиктивном цикле в конце первой задачи, но это просто пахнет плохо.Кажется, должен быть лучший путь.Я видел этот ТАК вопрос , но он не совсем отвечает на мой вопрос.

var exec = require('child_process').exec;

desc('first task');
task('first', [], function(params) {
  exec('long running system command');
});

desc('second task');
task('second', ['first'], function(params) {
  // do something dependent on the completion of 'first' task
});

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Я нашел ответ на свой собственный вопрос, перечитав пост Мэтью Эрниссе Для тех, кто интересуется, как это сделать:

var exec = require('child_process').exec;

desc('first task');
task('first', [], function(params) {
  exec('long running system command', function() {
    complete();
  });
}, true); // this prevents task from exiting until complete() is called

desc('second task');
task('second', ['first'], function(params) {
  // do something dependent on the completion of 'first' task
});
1 голос
/ 06 февраля 2013

Только для справки, у меня есть синхронный модуль exec без других зависимостей.

Пример:

var allsync = require("allsync");
allsync.exec( "find /", function(data){
    process.stdout.write(data);
});
console.log("Done!");

В приведенном выше примере Done печатается только после процесс find существует.Функция exec практически блокируется до завершения.

...