Javascript Gulp 4:如何在函数中使用Gulp.series()和Gulp.parallel()?

Javascript Gulp 4:如何在函数中使用Gulp.series()和Gulp.parallel()?,javascript,gulp,Javascript,Gulp,我想定义一个gulp4任务,它由三个串联执行的函数组成。但是,我想将其定义为命名函数,而不是使用gulp.task(): 函数beforeTest(){…} 函数coreTest(){…} 函数后测试(){…} 导出函数测试(){ //这里有什么? //此功能应等同于: //吞咽任务(“测试”,吞咽系列(测试前、测试中、测试后)); } 我在Gulp GitHub问题跟踪器上发现了一个类似的问题,OP在其中尝试了以下等效方法: 导出功能测试(){ 回灌系列(测试前、测试芯、测试后); } G

我想定义一个gulp4任务,它由三个串联执行的函数组成。但是,我想将其定义为命名函数,而不是使用
gulp.task()

函数beforeTest(){…}
函数coreTest(){…}
函数后测试(){…}
导出函数测试(){
//这里有什么?
//此功能应等同于:
//吞咽任务(“测试”,吞咽系列(测试前、测试中、测试后));
}
我在Gulp GitHub问题跟踪器上发现了一个类似的问题,OP在其中尝试了以下等效方法:

导出功能测试(){
回灌系列(测试前、测试芯、测试后);
}
GitHub问题解释了这不起作用的原因。Gulp团队推荐的解决方案是不使用命名函数,而是将复合函数分配给变量:

export const test=gulp.系列(测试前、测试中、测试后);
然而,由于一些原因,这种解决方案似乎有缺陷

第一个缺陷是在关于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
[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
但是,如果我有另一个引用
test
的复合任务,例如:

gulp.task('build',gulp.parallel(lint,test));
然后,当我运行
gulpbuild
时,复合
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
[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.系列(测试前、测试中、测试后);
test.displayName='test';
但这并没有改变
gulpbuild
的输出。我还尝试设置
test.name
,但该属性似乎已冻结:

TypeError: Cannot assign to read only property 'name' of function 'function series(done) {
    nowAndLater.mapSeries(args, asyncDone, extensions, done);
  }'
似乎如果我能将复合
test
任务定义为一个命名函数,它就能解决这两个缺陷。总之,我该如何定义问题顶部显示的
测试
函数的主体?

导出函数测试(…args){
回灌系列(测试前、测试芯、测试后)(…参数);
}
如果任何组件函数需要gulp任务回调参数(即
cb
done
,等等),则必须将函数参数传递到由
gulp.series()
返回的复合函数

此任务定义在运行
gulp build
时生成所需的输出:

[00:00:00] Starting 'build'...
[00:00:00] Starting 'lint'...
[00:00:00] Starting 'test'...
[00:00:00] Starting 'beforeTest'...
[00:00:01] Finished 'beforeTest' after 1.06 s
[00:00:01] Starting 'coreTest'...
[00:00:02] Finished 'coreTest' after 949 ms
[00:00:02] Starting 'afterTest'...
[00:00:02] Finished 'afterTest' after 302 μs
[00:00:02] Finished 'test' after 2.05 s
[00:00:07] Finished 'lint' after 7.12 s
[00:00:07] Finished 'build' after 7.12 s
编辑:此解决方案的一个缺陷是,通过将对
gulp.series()
的调用推迟到
test
任务实际执行之前,子任务不会显示在
gulp--tasks
显示的任务图中

例如,使用建议的解决方案,
gulp--tasks
的输出是

[00:00:00] Tasks for ~/gulpfile.babel.js
[00:00:00] └── test
然而,将
test
定义为原始GitHub版本中建议的变量,输出是

[00:00:00] Tasks for ~/gulpfile.babel.js
[00:00:00] └─┬ test
[00:00:00]   └─┬ <series>
[00:00:00]     ├── beforeTest
[00:00:00]     ├── coreTest
[00:00:00]     └── afterTest
~/gulpfile.babel.js的
[00:00:00]任务
[00:00:00] └─┬ 测试
[00:00:00]   └─┬ 
[00:00:00]     ├── 试验前
[00:00:00]     ├── 岩心测试
[00:00:00]     └── 事后
对于提出的问题,这不是一个问题,因为
beforeTest
coreTest
postertest
函数不是实际任务(即它们不是
export
ed),所以我实际上不希望它们出现。但是,因为我可以很容易地看到使用
export
ed子任务也会遇到同样的情况,所以我觉得这个解决方案在智力上并不完全令人满意