gulp-foreach没有遍历所有文件
我有一个非常基本的使用方法,那就是我一直在做错事; 我只是(现在)试图打印在gulp.src中find的所有文件。 当用gulp-foreach
做这件事时,只有非常非常小的文件样本被打印出来 – 大约有数百个中的15个。 当使用gulp-print的东西按预期工作。
const gulp = require('gulp'), foreach = require('gulp-foreach'), gulpPrint = require('gulp-print'); gulp.src([`../../**/*.js`].concat([])) .pipe(gulpPrint(path => { console.log(path); })) .pipe(foreach((stream, file) => { console.log(file.path); return stream; }))
与foreach
的代码被触发大约15次,与gulpPrint
交错,然后是单独的大量gulpPrint
声明。 如果我注释掉gulpPrint
部分, foreach
打印大约15次,然后退出,并且按照预期, gulpPrint
单独发现每个find的文件,并将其泛滥。
我可以使用gulp-print
,但我想知道我在做什么错误的gulp-foreach
。
首先: gulp-foreach
并不是你的用例的正确插件。
gulp-foreach
允许您为每个文件创build一个子stream,并将子stream的结果发送到原始stream。 这意味着您可以为每个input文件发出多个文件( 请参阅此示例 )。 在这方面,它和函数式编程中的高阶函数flatmap
非常相似。 这就是为什么gulp-flatmap
gulp-foreach
的作者最近把这个插件改名为 gulp-flatmap
。
所有你感兴趣的是访问stream中的每个文件并打印它的path,这使得这是一个高阶函数map
。 正确的插件是map-stream
或gulp-tap
(这是gulp-foreach
的作者用来推荐的 )。
现在到你的实际问题。
如前所述, gulp-foreach
将创build的子stream中的所有文件发送到原始stream。 但是,您对写入原始stream的文件没有任何帮助。 Node.js对象stream默认有16个highWaterMark
,所以一旦highWaterMark
gulp-foreach
将16个文件写入到原始stream中,缓冲区就已经满了,并且gulp-foreach
块。
为了解决这个问题,你需要使用gulp-foreach
写入stream的文件。 你可以简单地使用一个虚拟的.on('data')
处理程序来实现这个function:
gulp.src([`../../**/*.js`].concat([])) .pipe(gulpPrint(path => { console.log(path); })) .pipe(foreach((stream, file) => { console.log(file.path); return stream; })) .on('data', (data) => { });
然而,通常的做法是通过简单地返回来自其创build的任务的stream来消耗吞吐量:
gulp.task('default', function() { return gulp.src([`../../**/*.js`].concat([])) .pipe(gulpPrint(path => { console.log(path); })) .pipe(foreach((stream, file) => { console.log(file.path); return stream; })); });
你之所以没有看到所有的文件,是因为你没有返回一个承诺,并且在迭代所有文件之前完成任务
像这样返回gulp.src:
const gulp = require('gulp'), foreac**strong text**h = require('gulp-foreach'), gulpPrint = require('gulp-print'); gulp.task('default', function () { return gulp.src([`../../**/*.js`].concat([])) .pipe(gulpPrint(path => { console.log(path); })) .pipe(foreach((stream, file) => { console.log(file.path); return stream; }))
})