2017-01-11 3 views
1

Можно ли получить список файлов, идущий от gulp.src потока в виде массива, например:конвертировать поток gulp.src в массив?

var files = convertToArray(gulp.src('**/*.js')); 

Update:

Я пытался отойти от gulp-karma плагина:

gulp.task('test', function() { 
    return gulp.src(files) 
     .pipe($.order(ordering)) 
     .pipe($.karma({ 
      karma.conf.js' 
     }); 
}); 

Так что моя идея была:

gulp.task('test', function (done) { 
    var karmaFiles = convertToArray(gulp.src(files) 
     .pipe($.order(ordering))); 

    new Server({ 
     configFile: karma.conf.js', 
     files: karmaFiles 
    }, done).start(); 
}); 

Но, как указано, это не сработает из-за его асинхронности. Вот мое решение:

gulp.task('test', function (done) { 
    gulp.src(files) 
     .pipe($.order(ordering))) 
     .pipe(gutil.buffer()) 
     .on('data', function(data) { 
      var karmaFiles = data.map(function(f) { return f.path; }); 
      new Server({ 
       configFile: __dirname + '/karma.conf.js', 
       files: karmaFiles 
      }, done).start(); 
     }); 

}); 

ответ

2

глоток потоки всегда выполняется асинхронно, чтобы ваша гипотетический convertToArray функции (которая принимает поток и возвращает массив) невозможно.

Единственный способ получить все файлы в потоке - это какая-то функция обратного вызова. gulp-util пакет, который связывает различные вспомогательные функции, обеспечивает хороший gutil.buffer():

var gutil = require('gulp-util'); 

gulp.src('**/*.js').pipe(gutil.buffer(function(err, files) { 
    console.log('Path of first file:'); 
    console.log(files[0].path); 
    console.log('Contents of first file:'); 
    console.log(files[0].contents.toString()); 
})); 

В приведенном выше files будет массив vinyl файлов. Это означает, что для каждого файла у вас есть доступ к contents и path файла.

Если вы не заботитесь о содержимом файла и хотите только путь к каждому файлу, вы не должны использовать gulp.src(). Вместо этого вы должны использовать glob (это то, что использует внутренний глоток). Это дает синхронный метод, который возвращает массив соответствующих путей файлов:

var glob = require('glob'); 

var files = glob.sync('**/*.js'); 
console.log(files); 
+0

Спасибо за давая мне знать о 'залп-util', кажется, что будет соответствовать моим потребностям. Мой случай был немного сложнее, он также использовал плагин 'gulp-order', поэтому, получив список файлов из потока в' gulp.src (files) .pipe ($. Order (ordering)) ' – jamiebarrow

+0

I обновил мой вопрос, чтобы проиллюстрировать мою проблему, и включил мое решение. Дайте мне знать, если вы думаете, что есть лучший способ :) – jamiebarrow

+1

Поскольку вам действительно не нужно содержимое файла, вы можете использовать ['read: false'] (https://github.com/gulpjs/gulp/blob /master/docs/API.md#optionsread) с помощью 'gulp.src()'. Сохраняет время, чтобы прочитать содержимое файла без необходимости. В противном случае это выглядит хорошо. –