2016-01-29 5 views
0

Я пытаюсь установить пакеты через беседку, и как только установка будет завершена, я хочу, чтобы файлы были перемещены из папки dist в родительский, а затем удалили папку dist. Но почему-то это не работает должным образом.Задачи Gulp не работают синхронно

var gulp = require('gulp'), 
    bower = require('gulp-bower'), 
    del = require('del'), 
    fs = require('fs'), 
    path = require('path'), 
    merge = require('merge-stream'); 
    vinylPaths = require('vinyl-paths'); 
    runSequence = require('run-sequence'); 

var appPath="./www"; 
var folders = getFolders(appPath); 

/* Function to get folders present in www */ 
function getFolders(dir) { 
    return fs.readdirSync(dir) 
     .filter(function(file) { 
     return fs.statSync(path.join(dir, file)).isDirectory(); 
     }); 
} 

gulp.task('clean', function(){ 
    var tasks = folders.map(function(folder) { 
     return gulp.src(path.join(appPath, folder)) 
      .pipe(vinylPaths(del)) 
    }); 
}); 

/* Gulp task to run bower install */ 
gulp.task('bower', ['clean'], function() { 
    return bower({cmd: "install"}); 

}); 

/* Gulp task to copy files from dist folder to their parent folders */ 
gulp.task('moveFiles', ['bower'], function(){ 
    var tasks = folders.map(function(folder) { 
     console.log("FOLDER", folder); 
     return gulp.src(path.join(appPath, folder, '/dist/**/*')) 
      .pipe(gulp.dest(path.join(appPath, folder))); 

    }); 
    return tasks; 
}); 

/* Gulp task to clean the dist folder after files have been copied */ 
gulp.task('delete-dist-folder', ['moveFiles'], function() { 
    var tasks = folders.map(function(folder) { 
      return gulp.src(path.join(appPath, folder, '/dist')) 
       .pipe(vinylPaths(del)) 
    }); 
    return tasks; 
}); 

gulp.task('default', ['delete-dist-folder']); 

Это то, что я написал до сих пор. После беседы остальные две задачи не выполняются. Но если я запускаю их индивидуально, они работают отлично.

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

+0

В задаче 'clean' вы не возвращаетесь. Если вы хотите транслировать несколько потоков, вы можете захотеть взглянуть на [' map-stream'] (https://www.npmjs.com/package/карта-поток). – MarcoL

+0

@MarcoL: спасибо за предложение. Я попробую. – Shivi

ответ

-1

У меня была аналогичная проблема в то время, когда выполнялась задача вложенности (требующая одной задачи в другой). Итак, чтобы решить эту проблему и выполнить задачу в последовательности, я использовал run-sequence.

Возможно, вы установили run-sequence. Используйте его таким образом:

runSequence = require('run-sequence'); 

    gulp.task('default', function(callback) { 
     runSequence('clean', 'bower', 'moveFiles', 'delete-dist-folder', 
       callback); 
    }); 

Надеюсь, это может вам помочь. Вы можете обратиться за помощью this за помощью. Это временное решение до gulp 4.0, которое будет включать в себя возможность настроить выполнение задачи параллельно или последовательно.

+0

Я тоже пробовал это, но потом, кроме беседки, никакая другая задача не выполняется. Журналы консоли также не печатаются. Есть ли что-нибудь еще, что я могу пропустить? – Shivi

+0

Правильно ли 'src'? Значит, существует 'src' ..? Попробовал loggin 'src' ..? –

+0

yes ... src верен, потому что я вижу, что задачи работают нормально ... Если я запустил, как gulp bower, затем gulp moveFiles, затем gulp delete-dist-folder, они работают безупречно. – Shivi

1

Проблема в том, что вы возвращаете arrays событийных потоков. Посмотрите на свою задачу delete-dist-folder. Вы создаете return tasks и tasks по телефону .map на массиве. Таким образом, tasks представляет собой массив (потоков событий).

Gulp не знает, что делать с вашими массивами, и предполагает, что ваши задачи синхронны. Есть только 3 способа отметить задачу как асинхронную: 1) вернуть четный поток; Gulp будет ждать окончания потока, 2) вернуть обещание; Gulp будет ожидать, что обещание будет разрешено или отклонено, или 3) объявить обратный вызов вашей задачи, чтобы принять один параметр, который вы вызовете, когда ваша задача будет выполнена; Gulp будет ожидать вызова callback. Массив потоков событий не соответствует ни одному из этих параметров.

The Gulp wiki suggest using merge-stream Чтобы вернуть более одного потока из задачи. Судя по коду merge-stream, и предположим, что вы импортировали merge-stream как merge, вы могли бы сделать return merge.apply(undefined, tasks).

Боковой узел: в вашей задаче clean вы забыли вернуть значение.

Смежные вопросы