Использование Browserify только для подмножества файлов в папке в задаче Gulp

Обычно с Browserify, если вы хотите объединить несколько файлов, вы запускаете что-то вроде следующего:

gulp.task('build-tests', function() {
    var b = browserify({
                entries: ['./lib/some_specs.js', './lib/some_more_specs.js']
            });

    b.bundle().pipe(source('specs.js')).pipe(gulp.dest('./dist'));
})

Я хочу заменить записи динамически созданным отфильтрованным списком файлов, чтобы вместо обновления массива каждый раз, когда я добавляю новый файл, который я хочу просмотреть, он делал это автоматически.

Для этого я начал использовать gulp-filter для выбора файлов, которые я хочу просмотреть в папке:

gulp.src('lib/*.js')
    .pipe(gulpFilter('*_specs.js'))
    .pipe(concat('specs.js'))
);

Но поскольку это возвращает асинхронный поток, а не массив, вы не можете использовать это вместо записей. Затем я подумал, что могу объединить отдельные файлы в один виртуальный файл, а затем передать его в Browserify. Как это:

gulp.task('build-tests', function() {
    var b = browserify(
        gulp.src('lib/*.js')
            .pipe(gulpFilter('*_specs.js'))
            .pipe(concat('specs.js'))
        );

    b.bundle().pipe(source('specs.js')).pipe(gulp.dest('./dist'));
})

Но это вызывает необработанное событие ошибки - возможно, потому, что исходные файлы не были объединены до запуска метода пакета?

Так что это заставляет меня спросить, есть ли у кого-нибудь опыт выполнения чего-то подобного или в этом направлении? Я новичок в gulp, поэтому любые указатели также будут оценены. Спасибо.


person purpletonic    schedule 12.01.2015    source источник


Ответы (1)


Вместо этого используйте модуль glob.

var glob = require('glob').sync;

gulp.task('build-tests', function () {
    var b = browserify({
        entries: glob(['./lib/**/*.js'])
    });

    b.bundle().pipe(source('specs.js')).pipe(gulp.dest('./dist'));
});
person Ben    schedule 12.01.2015
comment
Спасибо, Бен, сделал пару настроек, но, кажется, работает отлично. Часто ли используется Glob вместо gulpFilter? Только пришлось изменить следующее: entries: glob('./lib/*_specs.js') - person purpletonic; 13.01.2015
comment
В этом случае вы хотите передать некоторые параметры browserify. Использование потокового интерфейса для этого не то, как вы хотите это сделать; вам просто нужны параметры во время выполнения. Поэтому вам нужно синхронно вводить их в browserify во время работы. gulp-filter предназначен для файлов, которые уже существуют в канале, но после запуска browserify (и запуска vinyl-source-stream) у вас есть один файл в канале, поэтому фильтр не работает. Чтобы второй пример работал, конструктор browserify должен принимать поток виниловых файлов, чего он не делает. :-) - person Ben; 13.01.2015