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

4

我有两组文件,分别称为basemods。其中mods文件将覆盖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'))
});

我想在base任务完成后运行mods任务。请注意,这与将base定义为mods的依赖项是不同的,因为如果我只更改了mods文件,则只需要运行mods任务。我不想使用插件。
我一直在阅读有关回调函数和同步任务的文档,但似乎无法理解。

你有冲突的需求。你希望modsbase之后运行,但只有在mods文件发生变化时才希望仅运行mods?这似乎不是很合理。 - Jake Wilson
抱歉我表达不够清晰。我有两种情况:当“base”文件更改时,我想运行“base”,然后运行“mods”。当“mods”文件更改时,我只想运行“mods”。 - nvioli
我也想到了,只是想确认一下。请看下面的答案。 - Jake Wilson
2个回答

7

我知道你不想使用插件,但是gulp没有一种方法可以在没有插件的情况下按顺序运行任务序列。Gulp 4会,但在此期间,临时解决方案是使用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 任务。
听起来正确吗?

那对我有用,谢谢!值得注意的是,gulp-run-sequence 的新版本叫做 run-sequence - mikhail-t

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接