我有一个非常基本的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做错了什么。
发布于 2016-08-10 02:49:27
首先: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;
}));
});发布于 2017-02-13 22:05:38
没有看到所有文件的原因是因为您没有返回承诺,并且任务在迭代所有文件之前已经完成
按如下方式返回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;
}))})
https://stackoverflow.com/questions/38855522
复制相似问题