2015-02-09 129 views
2

我有两套文件,我们称它们为basemodsmods文件覆盖base文件,所以当我运行与base相关的吞噬任务时,我需要在之后直接运行mods任务。我的设置是这样的:完成其他任务后运行gulp任务

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任务。我不想使用插件。

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

+0

您有冲突的要求。你希望'mods'在'base'后面运行,但如果只有'mods'文件被改变,你只希望'mods'自己运行?这完全没有意义。 – 2015-02-09 19:13:27

+0

对不起,我不清楚。我有两个用例:当'base'文件改变时,我想运行'base'和'mods'。当'mods'文件改变时,我只想运行'mods'。 – nvioli 2015-02-09 19:17:24

+0

我认为只是想确认一下。请参阅下面的答案。 – 2015-02-09 19:20:51

回答

6

我知道你不想使用插件,但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变化,一饮而尽将运行all任务,这将运行序列base然后mods

每当mods-glob发生变化,gulp将只运行mods任务。

这听起来正确吗?

+0

为我工作,谢谢!值得注意的是有一个更新版本的** gulp-run-sequence **,它被称为[run-sequence](https://www.npmjs.com/package/run-sequence) – 2015-02-11 16:05:09

+0

谢谢,更新了答案 – 2015-02-11 17:33:48

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