完成其他任务后运行gulp任务

时间:2015-02-09 19:01:19

标签: javascript gulp synchronous

我有两组文件,我们称之为basemodsmods文件会覆盖base个文件,因此当我运行与base相关的gulp任务时,我需要在之后直接运行mods任务。我的设置是这样的:

gulp.task('base',function(){
  return gulp.src('base-glob')
    .pipe(...)
    .pipe(gulp.dest('out-glob'))
});

gulp.task('mods',function(){
  return gulp.src('mods-glob')
    .pipe(...)
    .pipe(gulp.dest('out-glob'))
});

所以我希望在完成mods任务时运行base任务。请注意,这与将base定义为mods的依赖项不同,因为如果我只更改mods个文件,我只需要运行mods任务。我不想使用插件。

我一直在阅读有关回调函数和同步任务的其他建议的文档,但似乎无法理解它。

2 个答案:

答案 0 :(得分:7)

我知道你不想使用插件,但是gulp没有办法在没有插件的情况下按顺序运行一系列任务。 Gulp 4 will,但与此同时,权宜之计解决方案是run-sequence插件。

gulp.task('all', function() {
  runSequence('base', 'mods');
});

这确保了任务按顺序运行,而不是无序依赖。

现在设置一个手表:

gulp.task('watch', function() {
    gulp.watch('base-glob', ['all']);
    gulp.watch('mods-glob', ['mods']);
});

每当base-glob更改时,gulp将运行all任务,该任务将运行序列base,然后mods

每当mods-glob更改时,gulp将仅运行mods任务。

那听起来不错?

答案 1 :(得分:0)

runSequence有一些奇怪的错误,它一直在抱怨我的任务没有被定义。

如果您查看Orchestrator源代码,特别是.start()实现,您会看到如果最后一个参数是函数,它会将其视为回调函数。

我为自己的任务编写了这段代码:

  gulp.task( 'task1', () => console.log(a) )
  gulp.task( 'task2', () => console.log(a) )
  gulp.task( 'task3', () => console.log(a) )
  gulp.task( 'task4', () => console.log(a) )
  gulp.task( 'task5', () => console.log(a) )

  function runSequential( tasks ) {
    if( !tasks || tasks.length <= 0 ) return;

    const task = tasks[0];
    gulp.start( task, () => {
        console.log( `${task} finished` );
        runSequential( tasks.slice(1) );
    } );
  }
  gulp.task( "run-all", () => runSequential([ "task1", "task2", "task3", "task4", "task5" ));