2014-07-07 16 views
15

gulpfile.jstworzenia plików łyk zapisu synchronicznie przed przejściem do następnego zadania

gulp.task('browser-bundle', ['react'], function() { 
... 

}); 


gulp.task('react', function(){ 
    gulp.src(options.JSX_SOURCE) 
     .pipe(react()) 
     .pipe(gulp.dest(options.JSX_DEST)) 
}); 

Jak widać mam zadanie przeglądarce pakiet w zależności od zadania reagować. Wierzę, że to działa zgodnie z oczekiwaniami, ponieważ na wyjściu widzę to:

[gulp] Running 'react'... 
[gulp] Finished 'react' in 3.43 ms 
[gulp] Running 'browser-bundle'... 

Jednakże, chociaż zadanie reagować zakończeniu pliki jej powinien napisać do systemu operacyjnego nie są zupełnie tam jeszcze. Zauważyłem, że jeśli umieściłem polecenie sleep w komendzie przeglądarki, to działa zgodnie z oczekiwaniami, ale wydaje mi się to trochę odurzone.

Jeśli chcę, aby zadanie reagowania nie zostało uznane za zakończone do czasu, aż pliki (z gulp.dest) zostaną synchronicznie zapisane na dysku, w jaki sposób mogę to zrobić?

Odpowiedz

26

Trzeba instrukcji return:

gulp.task('react', function(){ 
    return gulp.src(options.JSX_SOURCE) 
     .pipe(react()) 
     .pipe(gulp.dest(options.JSX_DEST)) 
}); 

Dzięki temu wszystkie moje operacje zapisu są wykonywane przed kolejnym zadaniem przetwarzane.

+0

hah, tak, właśnie to wymyśliłem. Cóż, nadal otrzymujesz punkty, dziękuję za odpowiedź na – asolberg

+0

@Rwam Dev - czy mógłbyś podać link do tego, gdzie jest to udokumentowane? Z tego co przeczytałem, właściwy sposób jest następujący: http://stackoverflow.com/a/26336022/984407 – aaaaaa

+1

@aaaaa Spójrz na ten przepis: https://github.com/gulpjs/gulp/blob/master /docs/recipes/running-tasks-in-series.md Użycie 'return' w zadaniach gulp powoduje synchroniczne uruchomienie zadania. Brak 'return' == asynchroniczny. –

0

Zaakceptowanych odpowiedź jest na miejscu, ale jak na https://github.com/gulpjs/gulp/issues/899 w gałęzi 3.x haustem, nie można tego zrobić z zależnościami bez odrobiny wyjątkowy sos:

var run = require('run-sequence'); 
var nodeunit = require('gulp-nodeunit'); 
var babel = require('gulp-babel'); 
var gulp = require('gulp'); 

/// Explicitly run items in order 
gulp.task('default', function(callback) { 
    run('scripts', 'tests', callback); 
}); 

/// Run tests 
gulp.task('tests', function() { 
    return gulp.src('./build/**/*.tests.js').pipe(nodeunit()); 
}); 

// Compile ES6 scripts using bable 
gulp.task('scripts', function() { 
    return gulp.src('./src/**/*.js') 
    .pipe(babel()) 
    .pipe(gulp.dest('./build')); 
}); 

Wskazówka konkretnie użytkowania modułu "sekwencji uruchomień", aby wymusić uruchamianie zadań po kolei.

(Bez biegu rm -rf build && gulp spowoduje OK: 0 assertions (0ms) ponieważ zadanie tests nie znajdzie pliki utworzone przez zadanie scripts ponieważ rozpoczyna się przed zadaniem scripts jest całkowicie rozwiązany)

1

Met sam problem tutaj. Powiedzmy, że są 2 zadania: Pierwszy i Drugi. Drugi bieg po pierwszej. Pierwsze zadanie generuje pliki, które będą czytane przez drugie zadanie. Korzystanie z zależności nie gwarantuje, że drugie zadanie może znaleźć wygenerowane pliki.

Muszę jawnie używać wywołania zwrotnego done w potoku, aby pozwolić na drugie tylko zaczyna się po pierwszym naprawdę zrobione.

//This approach works! 
gulp.task('First', function(done)) { 
    var subFolders = fs.readdirSync(somefolder)... 
    var tasksForFolders = subFolders.map(function(folder) { 
     return gulp.src('folder/**/*').sthtogeneratefiles(); 
    }); 
    tasksForFolders[tasksForFolders.length-1].on('end',done); 
    return tasksForFolders; 
} 

gulp.task('Second', ['First'],function() { 
    return gulp.src('generatedfolders/**/*').doth(); 
} 

Bez done trik, druga nigdy nie znajdzie pliki wygenerowane przez First. Poniżej pokazano, co próbowałem, drugie zadanie może znaleźć pliki wygenerowane przez wywołanie gulp First ręcznie, a następnie wywołanie gulp Second następnie.

//This is the WRONG approach, just for demonstration!! 
gulp.task('First', function()) { 
    var subFolders = fs.readdirSync(somefolder)... 
    var tasksForFolders = subFolders.map(function(folder) { 
     return gulp.src('folder/**/*').sthtogeneratefiles(); 
    }); 
    return tasksForFolders; 
} 

gulp.task('Second', function() { 
    return gulp.src('generatedfolders/**/*').doth(); 
} 
Powiązane problemy