如何检查任务是否作为gulp @ 4中另一个任务的依赖项运行?

时间:2018-11-09 14:32:29

标签: gulp gulp-4

我使用gulp-notify来在任务完成时触发通知。如果任务是独立运行的,则会触发该特定任务的通知。如果一个任务作为另一个任务的依赖项运行,则会触发所有依赖项的通知。

在gulp @ 3中,我检查是否使用gulp.seq作为依赖项来调用任务,该任务包含正在运行的任务数组。假设我有三个任务:defaultstylesscripts,其中后两个设置为第一个的依赖项。运行gulp styles时,gulp.seq将包含[ 'styles' ]。运行gulp(默认任务)时,gulp.seq将包含[ 'styles', 'scripts', 'default' ]。知道了这一点,然后我检查gulp.seq.indexOf("styles") > gulp.seq.indexOf("default"),这告诉我是否stylesdefault任务的一部分。

对于gulp @ 4,看来gulp.seq不再存在。我试过没有运气的情况下浏览文档和源代码。似乎gulp.tree({ deep:true })docs)可能正是我想要的,但是我看不到任何返回有用信息的东西。

gulp @ 4中是否有gulp.seq的等价物?

2 个答案:

答案 0 :(得分:1)

API gulp.seq从来不是Gulp公开的官方prop。使用Gulp 4,您将无法做到这一点。 gulp.tree({ /* */ })不会为您解决这个问题。

话虽如此,如果您仍然需要查找某个任务是否在其他任务的管道中运行,那么您将必须使用自己的包装器来装饰每个gulp任务,如下所示:

let runTasks = [];

function taskWrapper(taskName, tasks, thisTask) {

    let callbackTask;

    function innerCallback(cb) {
        runTasks.push(taskName);
        cb();
    }

    if (thisTask) {
        callbackTask = function(cb) {
            thisTask(function () {
                innerCallback(cb);
            });
        }
    } else {
        callbackTask = innerCallback;
    }

    const newTasks = [ ...tasks, callbackTask ];

    gulp.task(taskName, gulp.series(newTasks));
}

// INSTEAD OF THIS
// gulp.task('default', gulp.series('style', 'script', function () { }));

// DO THIS
taskWrapper('default', ['style', 'script'], function(cb) {
    console.log('default task starting');
    cb();
});

注意:以上代码段具有局限性。如果您使用监视模式,则维护执行的任务(即runTasks)的数组将继续增长。此外,它假定任务将始终按顺序运行。对于并行模式,逻辑变得有点复杂。

最后,您还可以执行一个predefault任务来进一步帮助它:

taskWrapper('predefault', [], function(cb) {
    // RESET runTasks
    runTasks = [];
    cb();
});

taskWrapper('default', ['predefault', 'style', 'script'], function(cb) {
    console.log('default task starting');
    cb();
});

此外,我怀疑gulp-notify是否适用于Gulp 4。

答案 1 :(得分:0)

幸运的是,我发现可以通过已经安装的模块yargs来实现。

例如,在运行gulp styles时,我可以检查argv._.indexOf("styles") > -1,因为它包含['styles']。运行gulp(即默认任务)时,它包含[]。在我的测试中,这非常适合我的用例。