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

How can I check to see if a task is ran as a dependency of another task in 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"),它告诉我天气 styles 是否是 运行 作为 default 任务的一部分。

有了 gulp@4,gulp.seq 似乎不再存在。我试过在没有运气的情况下挖掘文档和源代码。似乎 gulp.tree({ deep:true }) (docs) 可能是我要找的东西,但我没有在其中看到任何 returns 有用的东西。

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

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.

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

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