2014-06-30 6 views
8

Momentan erstelle ich eine temporäre Datei in Gulp, die meine Vorlagen vorkompiliert. Danach ugglify und concate sie in eine Javascript-Datei. Aber ich hätte lieber keine temporären Dateien. Gibt es eine Möglichkeit, eine "dynamische" Quelle in Gulp zu haben? Ich habe versucht, Streams zu kombinieren, aber ohne Erfolg.Gulp Quelle von einer anderen Aufgabe

Beispielcode:

gulp.task('template', function() { 
    gulp.src('./src/tpl/*.hbs') 
    .pipe(ember()) 
    .pipe(concat('tpl.js')) // make sure to only do concat after 
    .pipe(gulp.dest('tmp')); 
}); 

gulp.task('uglify', ['template'], function() { 
    gulp.src(['./tmp/tpl.js', './src/js/app.js']) 
    .pipe(uglify()) 
    .pipe(concat('epg.js')) 
    .pipe(gulp.dest('dist')) 
}); 
+1

Vergessen Sie nicht, einen 'return' vor' gulp.src' dh 'return gulp.src (...) zu setzen 'damit die Aufgabe ein Versprechen zurückgibt, das erfüllt wird, wenn die Aufgabe abgeschlossen ist. – RustyToms

Antwort

12

Aufgaben können nicht direkt in andere Aufgaben geleitet werden, aber Sie können event-stream verwenden, um die Ströme zu fusionieren:

var es = require('event-stream'); 
function template() { 
    return gulp.src('./src/tpl/*.hbs') 
    .pipe(ember()); 
} 

function appjs() { 
    return gulp.src(['./src/js/app.js']); 
} 

gulp.task('uglify', function() { 
    return es.merge(template(), appjs()) 
    .pipe(uglify()) 
    .pipe(concat('epg.js')) 
    .pipe(gulp.dest('dist')); 
}); 
+0

Diese Antwort ist veraltet und inkorrekt, bitte beachten Sie meine, wo ich '{passthrough: true}' zusammen mit gulp.src verwende. –

11

So theoretisch sollten Sie in der Lage sein zu tun, dies mit Schluck Version 3.8.0 oder höher. Here is the changelog with an example of the feature.

Aus dem Changelog: sein könnte

gulp.src ist jetzt ein beschreibbarer Pass-Through, dies bedeutet, dass Sie es zu fügen Sie Dateien in Ihre Pipeline an jedem beliebigen Punkt

So Ihre Aufgabe verwenden können dies wie:

gulp.task('template', function() { 
    return gulp.src('./src/tpl/*.hbs') 
    .pipe(ember()) 
    .pipe(concat('tpl.js')) 
    .pipe(gulp.src('./src/js/app.js', { passthrough: true })) 
    .pipe(uglify()) 
    .pipe(concat('epg.js')) 
    .pipe(gulp.dest('dist')) 
}); 

Leider scheint es irgendeine Art von Fehler zu sein Wo es Probleme gibt, bestimmte Keulen zu handhaben, siehe die erwähnten Probleme here und here. Hoffentlich werden sie das bald gelöst haben. Das hindert mich daran, dies in meinem Projekt zu verwenden, aber in Ihrem Projekt fügen Sie nur eine einzige Datei hinzu, also probieren Sie es aus und vielleicht wird es funktionieren.

Wenn es nicht funktioniert, versuchen merge-stream https://github.com/gulpjs/gulp/blob/master/docs/recipes/using-multiple-sources-in-one-task.md

Edited verwenden, um die Pass-Through-Option, um gulp.src von Bjorn Tipling erwähnt

+0

Schöne Lösung. +1. Könnten Sie diesen Kommentar verdeutlichen: "Stellen Sie sicher, dass Sie nur danach concat machen".Irgendwie macht das keinen Sinn ... Bedeutet das "nach dem Glimmen", oder "stelle sicher, dass du dich versuchst, bevor du eine neue Quelle hinzufügst"? Tut mir leid, wenn es offensichtlich ist, ich möchte nur sicherstellen, dass ich verstehe. – mhulse

+1

@mhulse, ich habe keine Ahnung, du müsstest das OP fragen. Ich war selbst darüber verwirrt. Ich habe nur aus dem OP-Code kopiert. Ich bearbeite meine Antwort, um diesen Kommentar zu entfernen, da sie nicht mit dieser Lösung zusammenhängt. – RustyToms

+0

Doh! Mein Fehler! Das habe ich bis jetzt nicht gesehen. Danke für die Klärung und für die Antwort. :) – mhulse

1

Für noch jemand zu diesem Thema kommen Sie kann gulp.src verwenden, um zusätzliche Dateien zu einer Aufgabe im Midstream hinzuzufügen. Sie müssen einfach { passthrough: true } als Option hinzufügen. Hier ist ein funktionierendes Beispiel:

gulp.task(tasks.SASS,() => { 
    return gulp.src(paths.css.src) 
    .pipe(sass().on('error', sass.logError)) 
    .pipe(gulp.src([ paths.css.vueStyles ], { passthrough: true })) 
    .pipe(concat('styles.css')) 
    .pipe(gulp.dest(paths.css.dest)) 

Die einzige Linie, die auf diese Frage zählt, ist:

.pipe(gulp.src([ paths.css.vueStyles ], { passthrough: true })) 

Diese Details sind nicht notwendig auf die Frage, aber im Fall gibt es Verwirrung, ich nehme CSS-Dateien über SASS als Teil der Aufgabe erstellt und dann mit von webpack erstellten SASS-Dateien (aus Vue-Dateien extrahiert) in einer separaten Aufgabe verkettet. Meine tasks und paths Variablen sind nicht hart codierte Zeichenfolgen (die meiste Zeit).

Hinweis, habe ich schluck 4.0, aber ich glaube nicht, das Angelegenheiten, passthrough was added to master in 2015

+2

Funktionierte nicht für mich mit Schluck 3, der von einer alten Version von Vinyl-fs abhängt. Ich musste "npm install --save-dev vinyl-fs" machen und "gulp.src" durch 'require ('vinyl-fs'). Src' ersetzen. – alarive