我希望定义一个Gulp 4任务,它是由三个函数组成的串行执行。然而,我想将其定义为一个命名函数,而不是使用gulp.task()
:
function beforeTest() { ... }
function coreTest() { ... }
function afterTest() { ... }
export function test() {
// what goes here?
// this function should be equivalent to:
// gulp.task('test', gulp.series(beforeTest, coreTest, afterTest));
}
我在 Gulp GitHub 问题跟踪器上找到了一个类似的 问题,其中 OP 尝试了以下等价代码:
export function test() {
return gulp.series(beforeTest, coreTest, afterTest);
}
这个无法运行的原因在GitHub问题中有解释。 Gulp团队建议的解决方案是不使用命名函数,而是将复合函数分配给一个变量:
export const test = gulp.series(beforeTest, coreTest, afterTest);
然而,这种解决方案在几个方面似乎存在不足。
第一个不足之处是在 GitHub 问题的 评论 中提出的,即此限制对任务排序产生影响(我已经尝试通过使用命名函数而非 gulp.task()
来避免此问题,因为 Gulp 4 要求在引用任务名称前必须先注册它们)。
第二个不足更多是表面性的(因此触发了我的强迫症 :-))。在运行 gulp test
时,组合的 test
任务会显示在输出中:
[00:00:00] Starting 'test'...
[00:00:00] Starting 'beforeTest'...
[00:00:00] Finished 'beforeTest' after 106 ms
[00:00:00] Starting 'coreTest'...
[00:00:00] Finished 'coreTest' after 214 ms
[00:00:00] Starting 'afterTest'...
[00:00:00] Finished 'afterTest' after 280 μs
[00:00:00] Finished 'test' after 324 ms
然而,如果我有另一个涉及到
test
的组合任务,比如:gulp.task('build', gulp.parallel(lint, test));
当我运行
gulp build
命令时,复合任务 test
不会在输出中显示:[00:00:00] Starting 'build'...
[00:00:00] Starting 'lint'...
[00:00:00] Starting 'beforeTest'...
[00:00:01] Finished 'beforeTest' after 1.08 s
[00:00:01] Starting 'coreTest'...
[00:00:02] Finished 'coreTest' after 977 ms
[00:00:02] Starting 'afterTest'...
[00:00:02] Finished 'afterTest' after 232 μs
[00:00:07] Finished 'lint' after 6.96 s
[00:00:07] Finished 'build' after 6.96 s
我怀疑这可能是因为 Gulp 没有显示任何名为
series
或 parallel
的函数。我尝试设置 test.displayName
,如 GitHub 问题所建议的:export const test = gulp.series(beforeTest, coreTest, afterTest);
test.displayName = 'test';
但这并没有改变 gulp build
的输出结果。我也尝试设置 test.name
,但是该属性似乎被冻结了:
TypeError: Cannot assign to read only property 'name' of function 'function series(done) {
nowAndLater.mapSeries(args, asyncDone, extensions, done);
}'
看起来,如果我能将复合的test
任务定义为一个命名函数,它将解决这两个缺陷。因此,总结一下,我应该如何定义这个问题顶部显示的test
函数的主体?