2014-05-04 7 views
17

Ich versuche mein gulpfile zu trocknen. Da habe ich kleine Duplizierung von Code, mit dem ich mich nicht wohl fühle. Wie kann dies verbessert werden?Wie zu einer anderen Aufgabe in 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/')) 
}); 

Ich habe index als separate Aufgabe, da ich src/index.html livereload aufpassen müssen. Aber ich beobachte auch meine .coffee Quellen und wenn sie sich ändern, muss ich auch src/index.html aktualisieren.

Wie kann ich an index in scripts?

+0

Mögliche Duplikat [Wie Gulp Aufgaben synchron/nacheinander ausgeführt] (http://stackoverflow.com/questions/22824546/how- to-run-gulp-tasks-synchron-one-nach-dem-anderen) – falsarella

Antwort

25

gulp können Sie eine Reihe von Aufgaben basierend auf Argumenten bestellen.

Beispiel:

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

Versuchen Sie den folgenden Code, werden Sie die Aufgabe 'index' laufen beide Aufgaben auszuführen:

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/')) 
}); 

Die Aufgabe index jetzt scripts erfordern, bevor fertig zu sein Es führt den Code in seiner Funktion aus.

+0

Ich werde diesen Ansatz versuchen, sobald ich kann. – srigi

+1

und was passiert, wenn 'scripts' ausgeführt werden und es notwendig ist,' index' direkt nach 'scripts' auszuführen? – vsync

+2

Ich bevorzuge 'run-sequence', um meine Aufgaben zu orchestrieren, also ist diese Lösung im Allgemeinen korrekt - wiederhole Job in eigene gulp.task. – srigi

2

Wenn Sie in die Orchestrator-Quelle schauen, besonders die .start() Implementierung, werden Sie feststellen, dass wenn der letzte Parameter eine Funktion ist, diese als Callback behandelt wird.

Ich schrieb dieses Snippet für meine eigenen Aufgaben:

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"));