在使用Inkscape在gulp任务中使用SVG时遇到问题

那么,我正在尝试执行任务中的每个文件的inkscape任务。

这个想法是转换我在复合path中的每个SVG文件(一个SVG只由一个复杂的path组成)。

我试图用这样的东西来实现这个:

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

问题是,这个npm包Inkscape与stream一起工作,所以我应该以某种方式pipe道Inkscape输出并写回gulp file.contents。

这似乎不起作用,因为这个Inkscapestream输出到缓冲区的转换是asynchronous的,所以它不能与gulp任务stream同步。

我收到的错误是:

 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) 

有人可以帮我吗?

file.contents属性不一定是一个Buffer 。 它也可以stream。 你所要做的就是把buffer:false选项传给gulp.src()

然后就像使用通过调用.pipe()创build的新stream来replace现有的file.contentsstream一样简单:

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