我对 gulp-foreach 有一个非常基本的用法,但它失败得如此严重,我想我一定做错了什么;我只是(目前)尝试打印 gulp.src 中找到的所有文件。当使用 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
单独如预期的那样,会用每个文件已找到,正如它应该的那样。
我可以只使用gulp-print
,但我想知道gulp-foreach
我做错了什么。
最佳答案
首先:gulp-foreach
并不是真正适合您的用例的插件。
gulp-foreach
允许您为每个文件创建一个子流,并将子流的结果发送到原始流中。这意味着您可以为每个输入文件发出多个文件 ( see this example )。在这方面它与higher-order function flatmap
非常相似。在函数式编程中。这就是为什么 gulp-foreach
的作者有 recently renamed gulp-flatmap
的插件。
您感兴趣的是访问流中的每个文件并打印其路径,这使得 higher-order function map
成为一个例子。 。正确的插件是 map-stream
或gulp-tap
(这是 gulp-foreach
used to recommend 的作者)。
现在回答你的实际问题。
如前所述,gulp-foreach 将所有文件从创建的子流发送到原始流。但是,您对写入原始流的文件没有执行任何操作。 Node.js 对象流默认有一个 highWaterMark
16 个,因此一旦 gulp-foreach 将 16 个文件写入原始流,缓冲区就已满并且 gulp-foreach 会阻塞。
为了解决这个问题,您需要使用 gulp-foreach
写入流的文件。您可以简单地使用虚拟 .on('data')
处理程序来实现此目的:
gulp.src([`../../**/*.js`].concat([]))
.pipe(gulpPrint(path => {
console.log(path);
}))
.pipe(foreach((stream, file) => {
console.log(file.path);
return stream;
}))
.on('data', (data) => { });
然而,在 gulp 中执行此操作的通常方法是让 gulp 消耗流,而不是简单地从创建流的任务中返回流:
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;
}));
});
关于javascript - gulp-foreach 不循环遍历所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38855522/