2015-01-13 16 views
40

Ich habe einen Tag lang versucht, zwei Pipefunktionen zu schreiben, eine, die weniger Dateien kompiliert, und eine andere, die diese Dateien zusammenfasst. Ich möchte lernen, wie man transformierte Streams/Pipes für komplexere Plugins schreibt.Wie kann ich eine einfache Schluckfunktion schreiben?

Also ich möchte wissen, wie Daten aus einer anderen Leitung gelesen werden, und wie Sie diese Daten ändern und an die nächste Leitung senden. Das habe ich bisher:

gulp.src(sources) 
    .pipe(through.obj(function (chunk, enc, cb) { 

    var t = this; 
    // console.log("chunk", chunk.path); 
    fs.readFile(chunk.path, enc, function (err,data) { 
     if (err) { cb(err); } 

     less.render(data, { 
     filename : chunk.path, 
     sourceMap : { 
      sourceMapRootpath : true 
     } 
     }) 
     .then(function (outputCss) { 
      // console.log("less result",outputCss); 
      t.push(chunk);// or this.push(outputCss) same result 
      cb(); 
     }); 

    }); 

    })) 
    .pipe(through.obj(function (chunk, enc, cb) { 
    console.log("chunk", chunk.path); // not event getting called. 
    cb(); 
    })) 

Ich kann nicht die outputCSS für jede Datei in der zweiten Leitung erhalten. Wie kann ich es senden?

+0

https://github.com/gulpjs/gulp/blob/master/docs/writing-a-plugin/dealing-with-streams.md könnte einigen Menschen helfen. – Shanimal

Antwort

42

Nun, Sie brauchen fs hier nicht verwenden, Sie haben bereits den Strom der Datei (hier Ihre chunk).

Ein weiterer Punkt, du verschickst nicht die Dateien zurück an die Pipe, also denke ich, deshalb ist nichts auf deiner zweiten aufgerufen.

var through = require('through2') 

gulp.src(sources) 
    .pipe(through.obj(function (chunk, enc, cb) { 
    console.log('chunk', chunk.path) // this should log now 
    cb(null, chunk) 
    })) 

In ES2015:

import through from 'through2' 

gulp.src(sources) 
    .pipe(through.obj((chunk, enc, cb) => cb(null, chunk))) 

Und für Ihr konkretes Beispiel:

.pipe(through.obj(function (file, enc, cb) { 
    less.render(file.contents, { filename: file.path, ... }) // add other options 
    .then(function (res) { 
     file.contents = new Buffer(res.css) 
     cb(null, file) 
    }) 
})) 

Dies ist immer noch ziemlich einfach, überprüfe ich nicht für Fehler, wenn es keinen Strom ist und so, aber das sollte dir einen Hinweis geben, was du verpasst hast.

+0

Danke, dass Sie sich die Zeit genommen haben, meine Frage zu beantworten. Was ich aus Ihrem Code verstehe, ist, dass der Inhalt des Dateiobjekts durch einen Puffer der css-Zeichenfolge ersetzt werden muss, der von less erzeugt wird, und um sie an die nächste pipe-transform/write-Instanz zu senden, muss ich diese Datei als zweite weitergeben Argument für die CB-Funktion. Ich werde das heute versuchen und sehen, wie es funktioniert. –

+1

@vsync Einfach _in gulp_, es kann einfacher sein in verschiedenen Sprachen –

+0

@vsync das Wort wäre einfach, nicht einfach, denke ich. Die meisten Schluckrohrfunktionen müssen auf diese Weise Daten über sie senden. –

Verwandte Themen