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