2014-05-04 12 views
17

Próbuję suszyć mój plik gulp. Tam mam małe powielanie kodu, z którym nie jestem zadowolony. Jak można to poprawić?Jak potokować do innego zadania w Gulp?

gulp.task('scripts', function() { 
    return gulp.src('src/scripts/**/*.coffee') 
    .pipe(coffeelint()) 
    .pipe(coffeelint.reporter()) 
    .pipe(coffee()) 
    .pipe(gulp.dest('dist/scripts/')) 
    .pipe(gulp.src('src/index.html')) // this 
    .pipe(includeSource())    // needs 
    .pipe(gulp.dest('dist/'))   // DRY 
}); 

gulp.task('index', function() { 
    return gulp.src('src/index.html') 
    .pipe(includeSource()) 
    .pipe(gulp.dest('dist/')) 
}); 

mam index jako oddzielne zadanie, bo trzeba uważać src/index.html do livereload. Ale oglądam też moje źródła .coffee, a kiedy się zmieniają, muszę również zaktualizować src/index.html.

Jak mogę podłączyć do index w scripts?

+0

Możliwy duplikat [Jak uruchomić zadania haustem synchronicznie/jedna po drugiej] (http://stackoverflow.com/questions/22824546/how- to-run-gulp-tasks-synchronically-one-after-the-other) – falsarella

Odpowiedz

25

gulp umożliwia zamówienie szeregu zadań na podstawie argumentów.

Przykład:

gulp.task('second', ['first'], function() { 
    // this occurs after 'first' finishes 
}); 

Wypróbuj poniższy kod, zostanie uruchomione zadanie „index”, aby uruchomić oba zadania:

gulp.task('scripts', function() { 
    return gulp.src('src/scripts/**/*.coffee') 
    .pipe(coffeelint()) 
    .pipe(coffeelint.reporter()) 
    .pipe(coffee()) 
    .pipe(gulp.dest('dist/scripts/')); 
}); 

gulp.task('index', ['scripts'], function() { 
    return gulp.src('src/index.html') 
    .pipe(includeSource()) 
    .pipe(gulp.dest('dist/')) 
}); 

Zadaniem index będzie teraz wymagać scripts zostać zakończone przed uruchamia kod w jego funkcji.

+0

Spróbuję tego podejścia tak szybko, jak tylko będę mógł. – srigi

+1

i co jeśli 'scripts' będzie działał, i istnieje potrzeba uruchomienia' index' zaraz po 'scripts'? – vsync

+2

Wolę używać 'run-sequence' do aranżacji moich zadań, więc ogólnie rzecz biorąc to rozwiązanie jest poprawne - oddzielne powtarzające się zadanie we własne polecenie gulp.task. – srigi

2

Jeśli zajrzysz do źródła Orchestratora, szczególnie do implementacji .start(), zobaczysz, że jeśli ostatni parametr jest funkcją, potraktuje to jako wywołanie zwrotne.

pisałem ten fragment moich własnych zadań:

gulp.task('task1',() => console.log(a)) 
    gulp.task('task2',() => console.log(a)) 
    gulp.task('task3',() => console.log(a)) 
    gulp.task('task4',() => console.log(a)) 
    gulp.task('task5',() => console.log(a)) 

    function runSequential(tasks) { 
    if(!tasks || tasks.length <= 0) return; 

    const task = tasks[0]; 
    gulp.start(task,() => { 
     console.log(`${task} finished`); 
     runSequential(tasks.slice(1)); 
    }); 
    } 
    gulp.task("run-all",() => runSequential([ "task1", "task2", "task3", "task4", "task5"));