2015-01-13 14 views
40

मैं दो पाइप फ़ंक्शंस लिखने के लिए एक दिन की कोशिश कर रहा हूं, जो कम फ़ाइलों को संकलित करता है और दूसरा जो इन फ़ाइलों को संगत करता है। मैं सीखना चाहता हूं कि अधिक जटिल प्लगइन के लिए ट्रांसफॉर्म स्ट्रीम/पाइप कैसे लिखना है।मैं एक साधारण गल्प पाइप फ़ंक्शन कैसे लिख सकता हूं?

तो मैं जानना चाहता हूं कि किसी अन्य पाइप से डेटा कैसे पढ़ा जाए, और उस डेटा को कैसे बदलें और इसे अगले पाइप पर कैसे भेजें। यह मेरे पास अब तक है:

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(); 
    })) 

मुझे दूसरी पाइप में प्रत्येक फ़ाइल के लिए outputCSS नहीं मिल सकता है। मैं इसे कैसे भेज सकता हूं?

+0

https://github.com/gulpjs/gulp/blob/master/docs/writing-a-plugin/dealing-with-streams.md कुछ लोगों की सहायता कर सकता है। – Shanimal

उत्तर

42

ठीक है, आपको fs का उपयोग करने की आवश्यकता नहीं है, आपको पहले से ही फ़ाइल की स्ट्रीम मिल गई है (यहां आपका chunk)।

एक और बिंदु, आप फ़ाइलों को पाइप पर वापस नहीं भेज रहे हैं, इसलिए मुझे लगता है कि यही कारण है कि आपके दूसरे पर कुछ भी नहीं कहा जाता है।

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) 
    })) 

ES2015 में:

import through from 'through2' 

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

और अपने विशिष्ट उदाहरण के लिए:

.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) 
    }) 
})) 

यह अभी भी बहुत बुनियादी है, मैं, त्रुटियों की जांच नहीं करते हैं तो यह एक धारा नहीं है और इतने पर, लेकिन आपको जो कुछ याद आया है उस पर आपको कुछ संकेत देना चाहिए।

+0

मेरे प्रश्न का उत्तर देने के लिए समय निकालने के लिए धन्यवाद। मैं आपके कोड से जो समझता हूं वह यह है कि फाइल ऑब्जेक्ट सामग्री को कम से कम उत्पन्न सीएसएस स्ट्रिंग के बफर द्वारा प्रतिस्थापित करने की आवश्यकता है, और इसे अगले पाइप ट्रांसफॉर्म/लिखने के उदाहरण में भेजने के लिए मुझे इस फ़ाइल को दूसरे के रूप में पास करने की आवश्यकता है सीबी समारोह के लिए तर्क। मैं आज कोशिश करूँगा और देखता हूं कि यह कैसे काम करता है। –

+1

@vsync सरल _in gulp_, यह विभिन्न भाषाओं में आसान हो सकता है –

+0

@ vsync शब्द मूल होगा, मुझे लगता है कि सरल नहीं है। अधिकांश गल्प पाइप कार्यों को इस तरह से डेटा भेजने की आवश्यकता होती है। –

संबंधित मुद्दे