如何同步(编程)运行Grunt任务?

我想要一个在一个循环中同时运行子任务的任务,当一个子任务改变一个标志的值时,这样的循环就会被中断。

这是我正在尝试做的一个示例:

grunt.registerTask('complexTask', 'Run sub-tasks synchronously.', function () { var value; do { // 'changeValueTask' task sets 'importantValue' grunt.task.run(['preTask', 'changeValueTask', 'postTask']); value = grunt.config('importantValue'); } while (!value); // ... end task }); 

我想从中得到什么是

  • 确保每一组任务['preTask', 'changeValueTask', 'postTask'] )按顺序运行(依次)
  • 并打破循环的最佳方式

有没有可能实现这个?

注意:在一些研究之后,我能find的最接近的东西是Grunt允许定义如果task A没有完成,给定的task B就会失败(用grunt.task.requires : grunt.task.requires('A') )。

这就是我们如何解决它(遵循Bergi评论的脚步):

与其试图在Grunt上显式循环和运行任务,最好使用Grunt的自然任务链机制来确保一个任务在另一个之后执行,如

 grunt.task.run(['preTask', 'changeValueTask', 'postTask']); 

假设这样,我们在每个postTask的末尾使用recursion来检查是否需要再次运行(通过检查importantValue标志) – 我们通过自己的任务来实现

 grunt.task.run(['preTask', 'changeValueTask', 'postTask', 'taskCheck']); grunt.registerTask('taskCheck', 'Recursive task.', function() { var value = grunt.config('importantValue'); if (value) { // done... work with value } else { // keep running grunt.task.run(['preTask', 'changeValueTask', 'postTask', 'taskCheck']); } }); 

作为一个改进,我们可以引导这个整个recursion任务,以避免不必要的混乱,并隔离这种循环行为:

 grunt.registerTask('runValueTask', 'Bootstrap to start recursion.', function() { grunt.task.run(['preTask', 'changeValueTask', 'postTask', 'taskCheck']); }); grunt.registerTask('taskCheck', 'Recursive task.', function() { var value = grunt.config('importantValue'); if (value) { // done... work with value } else { // keep running grunt.task.run('runValueTask'); } });