Как сделать Gulp.src сбой, если файл отсутствует?

Наша сборка gulp берет кучу библиотек, установленных с помощью bower, а затем объединяет их со всем кодом, который мы распространяем в нескольких каталогах. Вот как это выглядит:

  var jsFiles = [
    sourcePath + '/config/config.js',
    sourcePath + '/vendor/jquery/dist/jquery.js',
    sourcePath + '/vendor/js-cookie/src/js.cookie.js',
    sourcePath + '/vendor/modernizr/modernizr.js',
    sourcePath + '/vendor/lodash/lodash.js',
    sourcePath + '/vendor/picturefill/dist/picturefill.min.js',
    sourcePath + '/templates/**/*.js',
    sourcePath + '/pages/**/*.js'
  ],

gulp.task('build:js', ['jscs'], function() {
  return gulp.src(jsFiles)
  .pipe(concat('scripts.js'))
  .pipe(gulpif(isProd, uglify()))
  .pipe(gulp.dest(outputPath + '/webresources/js'));
});

Наша проблема заключается в том, что всякий раз, когда кто-то добавляет новые библиотеки, другие разработчики будут сталкиваться с проблемами, если они не запускают bower install для получения новых компонентов. scripts.js создается без них, поскольку он не будет возражать, что один из глобусов возвращается пустым, даже если это именованный файл.

Как это можно решить? Есть ли способ выбросить ошибку, если glob возвращает нулевые результаты?

Ответ 1

Поскольку для этого не было готового решения, я написал модуль, соответствующий нашим потребностям.

Модуль files-exist позволяет проверить, присутствуют ли все файлы в массиве, если ошибка отсутствует, если они отсутствуют. Он возвращает идентичный массив при достижении успеха, поэтому его легко отменить.

  var jsFiles = [
    sourcePath + '/config/config.js',
    sourcePath + '/vendor/jquery/dist/jquery.js',
    sourcePath + '/vendor/js-cookie/src/js.cookie.js',
    sourcePath + '/vendor/modernizr/modernizr.js',
    sourcePath + '/vendor/lodash/lodash.js',
    sourcePath + '/vendor/picturefill/dist/picturefill.min.js',
    sourcePath + '/templates/**/*.js',
    sourcePath + '/pages/**/*.js'
  ],

filesExist = require('files-exist'),

gulp.task('build:js', ['jscs'], function() {
  return gulp.src(filesExist(jsFiles)) // Throws error if a file is missing
  .pipe(concat('scripts.js'))
  .pipe(gulpif(isProd, uglify()))
  .pipe(gulp.dest(outputPath + '/webresources/js'));
});

Ответ 2

Я использовал этот пакет IsThere

https://www.npmjs.com/package/is-there

ех.

PATHS:
    javascriptCopyNodeModules:
    # - "node_modules/name.min.js"

import IsThere  from 'is-there';

function javascriptCopyNodeModules() {
   if(IsThere(PATHS.javascriptCopyNodeModules)){
      return gulp.src(PATHS.javascriptCopyNodeModules)
        .pipe(gulp.dest(PATHS.dist + '/assets/js/node_modules'));
    }else{     
      return gulp.src('.');
   }
}

так как PATHS.javascriptCopyNodeModules пуст (#) ничего не возвращает.

Ответ 3

ПУТИ: javascriptCopyNodeModules: # - "node_modules/name.min.js"

импортировать IsThere из "есть";

function javascriptCopyNodeModules() {if (IsThere (PATHS.javascriptCopyNodeModules)) {return gulp.src(PATHS.javascriptCopyNodeModules).pipe(gulp.dest(PATHS.dist + '/assets/js/node_modules')); }else{ return gulp.src('path_of_file'); } else {return gulp.src('path_of_file'); } } }}