簡體   English   中英

Gulp任務無法同步運行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM