[英]Gulp tasks not running synchronously
我試圖通過Bower安裝軟件包,安裝完成后,我希望將文件從dist文件夾移至其父文件夾,然后刪除dist文件夾。 但是不知何故,它無法正常工作。
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']);
這是我到目前為止寫的。 涼亭之后,其余兩個任務將不運行。 但是,如果我單獨運行它們,它們可以很好地工作。
我無法弄清楚這里出了什么問題。 任何幫助將不勝感激。
問題是您返回事件流的數組 。 查看您的delete-dist-folder
任務。 您return tasks
並且通過在數組上調用.map
創建tasks
。 因此, tasks
是(事件流的)數組。
Gulp不知道如何處理數組,並假設您的任務是同步的。 只有三種方法可以將任務標記為異步:1)返回偶數流; Gulp將等待流結束,2)返回承諾; Gulp將等待諾言被解決或拒絕,或者3)聲明您的任務回調以采用單個參數,該參數將在任務完成時調用; Gulp將等待回調被調用。 事件流數組與任何這些選項都不對應。
Gulp Wiki 建議使用merge-stream
stream從任務返回多個流。 根據merge-stream
的代碼判斷,並假設您將merge-stream
導入為merge
,則可以return merge.apply(undefined, tasks)
。
側節點:在clean
任務中,您忘記了返回值。
嵌套任務時(前一個任務需要另一個任務),我有類似的問題。 因此,為了解決此問題並按順序運行任務,我使用了run-sequence
。
您似乎已經安裝了run-sequence
。 使用這種方式:
runSequence = require('run-sequence');
gulp.task('default', function(callback) {
runSequence('clean', 'bower', 'moveFiles', 'delete-dist-folder',
callback);
});
希望這對您有幫助。 您可以參考此以獲取任何幫助。 在gulp 4.0
,這是一個臨時解決方案,它將包括用於配置任務並行或順序運行的選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.