首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gulp foreach不会遍历所有文件

gulp foreach不会遍历所有文件
EN

Stack Overflow用户
提问于 2016-08-10 00:00:42
回答 2查看 5K关注 0票数 2

我有一个非常基本的gulp foreach用法,它失败得如此严重,我想我一定是做错了什么;我只是(现在)试图打印在gulp.src中找到的所有文件。在使用gulp-foreach执行此操作时,只会打印非常非常小的文件样本-数百个文件中大约有15个文件会被打印出来。在使用gulp-print时,事情会按预期运行。

代码语言:javascript
复制
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做错了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-10 02:49:27

首先:gulp-foreach并不是适合你的用例的插件。

gulp-foreach允许您为每个文件创建一个子流,并将子流的结果发送到原始流中。这意味着您可以为每个输入文件(see this example)发出多个文件。在这一点上,它与函数式编程中的higher-order function flatmap非常相似。这就是为什么gulp-foreach的作者将插件recently renamedgulp-flatmap的原因。

您所感兴趣的就是访问流中的每个文件并打印其路径,这就是higher-order function map的情况。正确的插件是map-streamgulp-tap (这就是gulp-foreach used to recommend的作者)。

现在来回答你的实际问题。

如前所述,gulp-foreach将创建的子流中的所有文件发送到原始流。但是,您没有对写入原始流的文件执行任何操作。默认情况下,Node.js对象流的highWaterMark为16,因此只要gulp-foreach将16个文件写入原始流,缓冲区就会满,并且会出现gulp-foreach块。

为了解决这个问题,你需要使用gulp-foreach写到流中的文件。为此,您可以简单地使用一个虚拟.on('data')处理程序:

代码语言:javascript
复制
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使用流,方法是简单地从创建流的任务返回流:

代码语言:javascript
复制
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;
    }));
});
票数 2
EN

Stack Overflow用户

发布于 2017-02-13 22:05:38

没有看到所有文件的原因是因为您没有返回承诺,并且任务在迭代所有文件之前已经完成

按如下方式返回gulp.src:

代码语言:javascript
复制
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;
    }))

})

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38855522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档