我如何检查一个任务是否 运行 作为 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
检查任务是否作为依赖项被调用,其中包含一个任务数组 运行。假设我有三个任务: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) 可能是我要找的东西,但我没有在其中看到任何 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
(即默认任务)时,它包含[]
。在我的测试中,这非常适合我的用例。
我使用 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) 可能是我要找的东西,但我没有在其中看到任何 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
(即默认任务)时,它包含[]
。在我的测试中,这非常适合我的用例。