Search code examples
javascriptcssnpmgulp

Convert gulp watch in gulp@3.9.1 to gulp@4


We are switching from gulp@3.9.1 to gulp@4 and are having trouble switching over. When we run gulp watch, we are getting the following errors and trying to figure out how to resolve it.

What is the proper way to convert the gulp watch task to work with gulp@4?

Error message

AssertionError [ERR_ASSERTION]: Task never defined: minify-css

Command: gulp watch

  • This should run minify-js then minify-css in order
  • minify-js should run after clean-scripts has completed successfully
  • minify-css should run after clean-css has completed successfully

Current tasks.

var gulp = require('gulp'),
    cssmin = require('gulp-clean-css'),
    clean = require('gulp-clean'),
    uglify = require('gulp-uglify');
    
var src = {
  js: 'js/some-dir/**/*.js',
  css: 'css/some-dir/**/*.css'
};

var dest = {
  js: 'js/dest/some-dir/**/*.js',
  css: 'css/dest/some-dir/**/*.css'
};

gulp.task('clean-css', function() {
  return gulp.src(dest.css)
             .pipe(clean({read:false, force: true});
});

gulp.task('minify-css', ['clean-css'], function() {
  gulp.src(src.css)
    .pipe(cssmin())
    .pipe(gulp.dest(dest.css));
});

gulp.task('clean-scripts', function() {
  return gulp.src(dest.js)
             .pipe(clean({read:false, force: true});
});

gulp.task('minify-js', ['clean-scripts'], function() {
   gulp.src(src.js)
       .pipe(uglify())
       .pipe(gulp.dest(dest.js));
});

gulp.task('watch', ['minify-js', 'minify-css'], function() {
  gulp.watch(src.js, ['minify-js']);
  gulp.watch(src.css, ['minify-css']);
});

We tried doing this, but it resulted in the error message

gulp.task('watch', gulp.series('minify-js', 'minify-css', function() {
  gulp.watch(src.js, ['minify-js']);
  gulp.watch(src.css, ['minify-css']);
}));


Solution

  • I would recommend converting your minify-js, minify-css, clean-scripts and clean-css tasks to functions:

    var dest = {
      js: 'js/dest/some-dir/**/*.js',
      css: 'css/dest/some-dir/**/*.css'
    };
    
    function cleanCss() {
      return gulp.src(dest.css)
                 .pipe(clean({read:false, force: true});
    });
    
    function minifyCss() {
      return gulp.src(src.css)
                 .pipe(cssmin())
                 .pipe(gulp.dest(dest.css));
    });
    
    function cleanScripts() {
      return gulp.src(dest.js)
                 .pipe(clean({read:false, force: true});
    });
    
    function minifyJs() {
       return gulp.src(src.js)
           .pipe(uglify())
           .pipe(gulp.dest(dest.js));
    });
    
    var minifyJsAndClean = gulp.series(minifyJs, cleanScripts);
    var minifyCssAndClean = gulp.series(minifyCss, cleanCss);
    var watchers = function (done) {
       gulp.watch(src.js, minifyJs);
       gulp.watch(src.css, minifyCss);
       done();
    }
    
    gulp.task('watch', gulp.series(minifyJsAndClean, minifyCssAndClean, watchers));