2017-02-09 8 views
0

Я хочу определить задачу Gulp 4, которая представляет собой композицию из трех функций, выполняемых последовательно. Тем не менее, я хочу, чтобы определить его как именованной функции, а не с помощью gulp.task():Gulp 4: Как использовать gulp.series() и gulp.parallel() внутри функции?

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)); 
} 

Я нашел подобный question задал на вопрос трекера Глоток GitHub, где ОП пытался эквивалент следующее:

export function test() { 
    return gulp.series(beforeTest, coreTest, afterTest); 
} 

Причина, по которой это не работает, объясняется в проблеме GitHub. Рекомендуемое решение команды Глоток было не использовать указанную функцию, но и достаточно назначить сложную функцию переменной:

export const test = gulp.series(beforeTest, coreTest, afterTest); 

Однако это решение оказывается недостаточным по нескольким причинам.

Первый недостаток был поднят в comment по вопросу GitHub об ограничении это место на упорядочении задач (то, что я уже пытался избежать с помощью именованных функций вместо gulp.task() из-за новый requirement в Глотке 4, имена задач должны быть зарегистрированы до их ссылки).

Второй недостаток более косметический (и, таким образом, запускает мой OCD :-)). При запуске 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, показанной в верхней части этого вопроса?

ответ

0
export function test(...args) { 
    return gulp.series(beforeTest, coreTest, afterTest)(...args); 
} 

аргументов функции должен быть передан через к сложной функции, возвращаемой gulp.series() в случае любой функция компонента требует параметра обратного вызова Глотка задачи (т.е. cb, done, что угодно).

Это определение задачи дает желаемый результат при работе 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 

EDIT: Недостаток этого решения заключается в том, что с помощью отложив вызов 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 

Это не является проблемой для поставленного вопроса, поскольку функции , coreTest и afterTest не являются актуальными задачами (т.е. они не являются export ред), поэтому я actua не хотят, чтобы они появлялись. Но, поскольку я легко вижу, что попадаю в ту же ситуацию с подзадачами под редакцией export, я не чувствую, что это решение полностью интеллектуально удовлетворяет.