我使用gulp-notify
来在任务完成时触发通知。如果任务是独立运行的,则会触发该特定任务的通知。如果一个任务作为另一个任务的依赖项运行,则会触发所有依赖项的通知。
在gulp @ 3中,我检查是否使用gulp.seq
作为依赖项来调用任务,该任务包含正在运行的任务数组。假设我有三个任务:default
,styles
和scripts
,其中后两个设置为第一个的依赖项。运行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)可能正是我想要的,但是我看不到任何返回有用信息的东西。
gulp @ 4中是否有gulp.seq
的等价物?
答案 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
(即默认任务)时,它包含[]
。在我的测试中,这非常适合我的用例。