Как заставить 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 создается без них, так как он не будет возражать, что один из глобусов возвращается пустым, даже если это именованный файл.

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

2 ответа

Решение

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

Модуль 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'));
});

Я использовал этот пакет 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 пуст (#), ничего не возвращать.

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

импортировать IsThere из '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 ('путь_файла'); } }

Вы можете использовать gulp-plumber плагин gulp для получения ошибки при сборке.

Пример для иллюстрации:

Шаг 1: Установите глоток-сантехник:

npm i --save-dev gulp-plumber 

Шаг 2: Требовать модуль gulp plmber в gulpfile:

...
var plumber = require('gulp-plumber'),
...   

Шаг 3: использование

gulp.task('concatFiles', function (done) {
    
    gulp.src(['../a.js', '../b.js', '../c.js'])
        .pipe(plumber())
        .pipe(concat('destination.js'))
        .pipe(plumber.stop())
        .pipe(gulp.dest('dist/js'));

    done(); // a callback required in gulp 4
});
Другие вопросы по тегам