2017-02-09 6 views
0

私はGulp 4タスクを定義したいと思います.Gulp 4タスクは、直列に実行される3つの関数の構成です。しかし、私はむしろgulp.task()を使用するよりも名前の関数として定義したい:Gulp 4:関数内でgulp.series()とgulp.parallel()を使用するにはどうすればよいですか?

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

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はOPは次の同等のものを試してみましたガルプのGitHubのイシュートラッカーに尋ねました

これが動作しない理由は、GitHubの問題で説明されています。ガルプチームからの推奨されるソリューションは、名前の関数を使用するのではなく、変数への複合機能を割り当てることがありませんでした:

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

しかし、この解決策はいくつかの理由のために欠損表示されます。

最初の欠乏はがぶ飲み4タスク名、その内のタスクの順序でこの場所(私はすでに名前の関数の代わりに、gulp.task()を使用して避けるようにしようとしていた何かによる新しいrequirementに制限についてGitHubの問題にcommentで育ちました参照する前に登録する必要があります)。

2番目の欠点は、より美容的です(したがって、私のOCDを引き起こします:-))。

gulp.task('build', gulp.parallel(lint, test)); 

その後、私は実行するとgulp build、私のような、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 

しかし:gulp testを実行している場合は、複合testタスクが出力に表示されます複合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という名前の関数を表示しないためかもしれません。

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

しかし、それはgulp buildの出力を変更しなかった:GitHubの問題で提案されているように私は、test.displayNameを設定してみました。私はまた、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()によって返された複合関数に通過しなければならない(すなわちcbdone何でも)ガルプタスクコールバックパラメータを必要とします。

[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:このソリューションの欠点があるtestタスクまでgulp.series()への呼び出しを延期することによって実際に実行されていることを、子タスクをgulp buildを実行するときに

このタスク定義は、所望の出力を生成しますgulp --tasksによって表示されるタスクマップには表示されません。例えば

は、提案された解決策を使用して、gulp --tasksの出力は、元のGitHub号に示唆されているように変数としてtestを画定する、

[00:00:00] Tasks for ~/gulpfile.babel.js 
[00:00:00] └── test 

一方で、出力は

[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 

これはbeforeTestcoreTest、およびafterTestの関数は実際のタスクではない(つまり、それらはexportになっていない)ので、私は実行された質問の問題ではないllyはそれらが現れることを望まない。しかし、私は簡単にexportサブタスクで同じ状況になるのを見ることができるので、私はこの解決策が完全に知的に満足しているとは思わない。

関連する問題