Node.js et Jake – Comment appeler les commandes du système de manière synchrone dans une tâche?

Une tâche Jake exécute une commande système longue durée. Une autre tâche dépend de la première tâche terminée avant le démarrage. La fonction 'exec' de 'child_process' exécute les commandes du système de manière asynchrone, ce qui permet à la deuxième tâche de commencer avant la fin de la première tâche.

Quelle est la manière la plus propre d'écrire le Jakefile pour s'assurer que la commande du système à long terme dans la première tâche se termine avant le début de la deuxième tâche?

J'ai pensé à utiliser le sondage dans une boucle fictive à la fin de la première tâche, mais cela sent juste mauvais. Il semble qu'il y ait une meilleure façon. J'ai vu cette question SO , mais cela ne répond pas à ma question.

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 }); 

J'ai trouvé la réponse à ma propre question en re-relisant le message de Matthew Eernisse . Pour ceux qui se demandent comment le faire:

 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 }); 

Juste pour référence future, j'ai un module exec synchrone sans autres dépendances.

Exemple:

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

Dans l'exemple ci-dessus, Done est imprimé uniquement après l'existence du processus de find . La fonction exec bloque essentiellement jusqu'à ce qu'elle soit complète.