Search code examples
angularjsgulpglobgulp-filternode-glob

Conditionally Ignore files in gulp.src


The source code is used for 2 projects, Each project has some common code. I want to conditionally ignore a module/folder/directory via gulp task.

When I do following it works perfectly

return gulp.src(
  config.appMarkupFiles
  '!app/settings', '!app/settings/**'
)

However, I want to do it conditionally. I have also tried the following code using gulp-filter which does not work for me.

var isQA = $.yargs.argv.stage === 'qa';

var filterSettings = $.filter(['!app/settings{, /**}'])
return gulp.src(
  config.appMarkupFiles
)
.pipe(($.if(isQA,$.filter(filterSettings)))

folder structure for reference only.


Solution

  • Your gulpfile is just JavaScript so you can use the ternary operator to conditionally exclude files in gulp.src():

    var isQA = $.yargs.argv.stage === 'qa';
    
    gulp.task('default', function() {
      return gulp.src([config.appMarkupFiles].concat((isQA) ? ['!app/settings{,/**}'] : []))
        .pipe(gulp.dest('dist'));
    });
    

    Using gulp-filter works, but you had two mistakes in your code:

    1. There's an unnecessary space in !app/settings{, /**} and
    2. You're applying $.filter twice.

    Here's a working solution using gulp-filter:

    var isQA = $.yargs.argv.stage === 'qa';
    
    gulp.task('default', function() {
      return gulp.src(config.appMarkupFiles)
        .pipe($.if(isQA, $.filter(['!app/settings{,/**}'])))
        .pipe(gulp.dest('dist'));
    });