gulp-foreach не перебирает все файлы

У меня очень простое использование 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,

2 ответа

Решение

Прежде всего: gulp-foreach не совсем подходящий плагин для вашего случая использования.

gulp-foreach позволяет создавать подпоток для каждого файла и отправлять результаты подпотока в исходный поток. Это означает, что вы можете создать несколько файлов для каждого входного файла ( см. Этот пример). В этом отношении она очень похожа на функцию высшего порядка flatmap в функциональном программировании. Вот почему автор gulp-foreach недавно переименовал плагин в gulp-flatmap,

Все, что вас интересует, - это получить доступ к каждому файлу в потоке и распечатать его путь, что делает это случаем функции высшего порядка. map, Правильные плагины для этого map-stream или же gulp-tap (это то, что автор gulp-foreach привык рекомендовать).

Теперь к вашему актуальному вопросу.

Как уже упоминалось 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;
    }));
});

Причина, по которой вы не видите все файлы, заключается в том, что вы не возвращаете обещание, и задача завершается, прежде чем перебрать все файлы.

верните 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;
    }))

})

Другие вопросы по тегам