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

})