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.