まとまり毎にタスクを実行

デフォルトでは、タスクは最大限並列に処理されます。 つまりこれは全てのタスクを一度に発行し、待機タスクは無いということになります。 もし特定の順番で実行するタスクのまとまりを作成したいのであれば、 2つのことを行う必要があります。

  • タスクが完了した際に指示を伝えることと、
  • 他のタスクの完了への依存情報を伝える必要があります。

下記の例で、あなたは2つのタスク"one"と"two"を持ち、 これを特定の順で実行したいと仮定します。

  1. タスク"one"では、完了時にそれを伝える処理を追加します。 完了時にコールバックを取得してそれを呼び出すか、 それぞれ待機・終了をするpromiseまたはストリームを返すかのどちらかを行います。
  2. タスク"two"では、1つ目のタスクの完了に依存することを伝える仕組みを追加します。

これらを踏まえると、次のようになります。

var gulp = require('gulp');

// 完了時にコールバックを取得するため、完了時にそれを知ることが可能
gulp.task('one', function(cb) {
    // 非同期または何かしらの処理を実行
    cb(err); // errがnullでもundefinedでも無ければ、
             // 処理は停止し、'two'は実行されない。
});

// このタスクを始める前に完了していなければならない依存タスクを特定
gulp.task('two', ['one'], function() {
    // この時、タスク'one'は完了済み
});

gulp.task('default', ['one', 'two']);
// または: gulp.task('default', ['two']);

下記はコールバックを使用する代わりにストリームを返す別の例になります。

var gulp = require('gulp');
var del = require('del'); // rm -rf

gulp.task('clean', function(cb) {
    del(['output'], cb);
});

gulp.task('templates', ['clean'], function() {
    var stream = gulp.src(['src/templates/*.hbs'])
        // 連結やminify処理等を実行
        .pipe(gulp.dest('output/templates/'));
    return stream; // 完了情報として、ストリームを返す。

});

gulp.task('styles', ['clean'], function() {
    var stream = gulp.src(['src/styles/app.less'])
        // 連結やminify処理等を実行
        .pipe(gulp.dest('output/css/app.css'));
    return stream;
});

gulp.task('build', ['templates', 'styles']);

// templatesとstylesは並列に処理されます。
// cleanは上記のいずれかが開始される前に完了していることが保証されます。
// cleanは2箇所で依存され呼び出されたとしても、2度実行されることはありません。

gulp.task('default', ['build']);

 Back to top

© 2010 - 2017 STUDIO KINGDOM