Последовательность выполнения не выполняет задачи gulp по порядку

У меня есть 3 задачи в моем файле Gulp, которые должны выполняться в следующем порядке:

  1. clean (удаляет все в /dist папка)
  2. copy (копирует несколько файлов в /dist папка)
  3. replace (заменяет некоторые строки в некоторых файлах в /dist папка)

Я прочитал все остальные посты, я пробовал "последовательность выполнения", но она не работает, так как задача "заменить" не выполняется в последнюю очередь. Я смущен использованием "обратного вызова". Запуск задач по отдельности работает нормально.

var gulp = require('gulp');
var runSequence = require('run-sequence');

gulp.task('runEverything', function(callback) {
    runSequence('clean',
                'copy',
                'replace',
                callback);
});

gulp.task('clean', function () {
    return del(
        'dist/**/*'
    );
});

gulp.task('copy', function() {
    gulp.src('node_modules/bootstrap/dist/**/*')
        .pipe(gulp.dest('dist/vendor'))
    //...
    return gulp.src(['index.html', '404.html', '.htaccess'])
        .pipe(gulp.dest('dist/'));
});

gulp.task('replace', function(){
    gulp.src(['dist/index.php', 'dist/info.php'])
        .pipe(replace('fakedomain.com', 'realdomain.com'))
        .pipe(gulp.dest('dist'));

    return gulp.src(['dist/config.php'])
        .pipe(replace('foo', 'bar'))
        .pipe(gulp.dest('dist'));
});

Полный пример использования этих 3 задач будет принята с благодарностью. Спасибо.

1 ответ

Решение

run-sequence Документация может сказать следующее о задачах с асинхронными операциями:

убедитесь, что они либо возвращают поток или обещание, либо обрабатывают обратный вызов

Оба ваши copy а также replace задачи имеют более одного потока. Вы должны вернуть все потоки, а не только последний. Gulp не будет ничего знать о других потоках, если вы не вернете их, и поэтому не будете ждать их завершения.

Поскольку вы можете когда-либо возвращать только один поток, вы должны объединить потоки [вставьте сюда ссылку на Ghostbusters]. Это даст вам один объединенный поток, который вы сможете вернуть из своей задачи.

Вот как это сделать, используя merge-stream пакет:

var merge = require('merge-stream');

gulp.task('copy', function() {
    var stream1 = gulp.src('node_modules/bootstrap/dist/**/*')
        .pipe(gulp.dest('dist/vendor'))
    //...
    var stream2 = gulp.src(['index.html', '404.html', '.htaccess'])
        .pipe(gulp.dest('dist/'));

    return merge(stream1, stream2);
});

gulp.task('replace', function(){
    var stream1 = gulp.src(['dist/index.php', 'dist/info.php'])
        .pipe(replace('fakedomain.com', 'realdomain.com'))
        .pipe(gulp.dest('dist'));

    var stream2 = gulp.src(['dist/config.php'])
        .pipe(replace('foo', 'bar'))
        .pipe(gulp.dest('dist'));

    return merge(stream1, stream2);
});
Другие вопросы по тегам