2016-09-06 7 views
2

まあ、私はgulpタスクのすべてのファイルに対してinkscapeタスクを実行しようとしています。gulpタスクでInkscapeを使用してSVGを使用する際に問題が発生する

アイデアは、私が複合パス(1つの複合パスだけで構成されたSVG)にあるすべてのSVGファイルを変換することです。私はこのようなものでこれを達成しようとしている

gulp.task('minify-shapes', function() { 
    function makeChange() { 
     var Stream = require('stream'); 

     function transform(file, cb) { 
      var svgConverter = new Inkscape(['--verb=ObjectToPath', '--export-plain-svg']); 

      var stdout = new Stream(); 
      var bufs = []; 

      console.log(file.history); 

      stdout.on('data', function(d) { 
       bufs.push(d); 
      }); 

      stdout.on('end', function() { 
       var buf = Buffer.concat(bufs); 

       file.contents = buf; 

       cb(null, file); 
      }); 

      file.pipe(svgConverter).pipe(stdout); 
     } 

     return require('event-stream').map(transform); 
    } 

    return gulp.src('app/assets/shapes/**/*.svg') 
     .pipe(makeChange()) 
     .pipe(gulp.dest('app/assets/shapes')); 
}); 

問題があり、Inkscapeのは、ストリームと連携し、このNPMパッケージ、私は何とかパイプInkscapeの出力とfile.contentsを飲み込むために書き戻す必要があります。

このInkscapeストリーム出力のバッファへの変換が非同期であるため、gulpタスクフローと同期して動作しないため、これは機能しないようです。

私が受けてるのエラーは次のとおりです。

stream.js:59 
    dest.end(); 
     ^

TypeError: dest.end is not a function 
    at Inkscape.onend (stream.js:59:10) 
    at emitNone (events.js:91:20) 
    at Inkscape.emit (events.js:185:7) 
    at Inkscape.<anonymous> (node_modules\inkscape\lib\Inkscape.js:161:26) 
    at emitNone (events.js:91:20) 
    at ReadStream.emit (events.js:185:7) 
    at endReadableNT (_stream_readable.js:926:12) 
    at _combinedTickCallback (internal/process/next_tick.js:74:11) 
    at process._tickCallback (internal/process/next_tick.js:98:9) 

誰かが私を助けることができますか?

答えて

2

file.contentsプロパティは、Bufferである必要はありません。それはストリームでもあります。 buffer:false optiongulp.src()に渡すだけです。

は、その後、それは.pipe()を呼び出すことによって作成される新しいストリームで既存のfile.contentsストリームを交換するのと同じくらい簡単です:

var gulp = require('gulp'); 
var map = require('event-stream').map; 
var Inkscape = require('inkscape'); 

gulp.task('minify-shapes', function() { 
    return gulp.src('app/assets/shapes/**/*.svg', { buffer:false }) 
    .pipe(map(function(file, done) { 
     var svgConverter = new Inkscape([ 
     '--verb=ObjectToPath', 
     '--export-plain-svg' 
     ]); 

     file.contents = file.contents.pipe(svgConverter); 
     done(null, file); 
    })) 
    .pipe(gulp.dest('app/assets/shapes')); 
}); 
こんにちは、あなたの答えのためのおかげで、このコードは今、しかし:)私よりずっと良く見える
+0

別のエラーが表示されます: [20:16:28] 'minify-shapes'を開始しています... events.js:160 throw er; //処理されていない 'error'イベント ^ エラー:ストリーミングがサポートされていません –

+0

ストリームをサポートしていないパイプで別のプラグインを使用していたため、忘れました。 –

関連する問題