ошибка gulp-uglifyjs, когда gulp.src не возвращает файлы

У меня есть неизвестное количество папок внутри каталога с именем app, которые я перебираю, чтобы создать folderName.min.js для каждой.

Глотковый скрипт:

var es = require('event-stream');
var uglify = require('gulp-uglifyjs');
var fs = require('fs');
var path = require('path');

function getFolders(dir) {
  return fs.readdirSync(dir)
    .filter(function (file) {
      return fs.statSync(path.join(dir, file)).isDirectory();
  })
}

gulp.task('js', function () {
  var folders = getFolders('./src/app/');

  var streams = folders.map(function (folder) {

    return gulp.src(folder + '**/*.js')
      .pipe(uglify(folder + '.min.js', {
        mangle: true
      }))
      .pipe(gulp.dest('./dist/js'))
  });

  return es.concat.apply(null, streams);
});

Проблема, с которой я сталкиваюсь, заключается в том, что не каждая папка содержит *.js файлов. Когда gulp-uglifyjs сталкивается с этим случаем, я получаю

gulp-uglifyjs - No files given; aborting minification

и поток прерывается, и все последующие задачи не запускаются. Могу ли я

а) скажите uglifyjs, чтобы он продолжал действовать в любом случае, если он столкнется с этим случаем

б) пропустить задачу, если gulp.src не вернул файлов?


person Dustin    schedule 29.06.2014    source источник


Ответы (1)


Решение состояло в том, чтобы изменить мою функцию getFolders, чтобы возвращать только папки, содержащие файлы JavaScript. Я сделал это, пройдясь по каждому подкаталогу внутри app и проверив, были ли найдены какие-либо файлы *.js.

function getJSFolders(dir) {
  return fs.readdirSync(dir)
    .filter(function (file) {
      var files;
      var isDir = fs.statSync(path.join(dir, file)).isDirectory();
      var hasJs = false;

      if (isDir) {
        files = getFiles(path.join(dir, file));

        for (var i = 0; i < files.length; i++) {
          if (path.extname(files[i]) === '.js') {
            hasJs = true;
            break;
          }
        }
      }

      return isDir && hasJs;
    });
}

function getFiles(dir, filesArr) {
  var files = fs.readdirSync(dir);
  filesArr = filesArr || [];

  for (var i in files) {
    if (!files.hasOwnProperty(i)) continue;
    var name = dir + '/' + files[i];
    if (fs.statSync(name).isDirectory()) {
      getFiles(name, filesArr);
    } else {
      filesArr.push(name);
    }
  }

  return filesArr;
}
person Dustin    schedule 29.06.2014