5

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

在 gulp@3 中,我使用 来检查任务是否作为依赖项被调用gulp.seq,其中包含正在运行的任务数组。假设我有三个任务:defaultstylesscripts,后两个设置为第一个的依赖项。运行时gulp stylesgulp.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 ) 可能是我正在寻找的东西,但我没有看到任何返回任何有用的东西。

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

4

2 回答 2

1

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

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

于 2018-11-14T15:09:00.880 回答
1

该 APIgulp.seq从未prop被 Gulp 公开。使用 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。

于 2018-11-13T05:12:05.433 回答