Arnold Rimmer Arnold Rimmer - 10 months ago 124
Javascript Question

Gulp error: watch task has to be a function

Here is my gulpfile:

// Modules & Plugins
var gulp = require('gulp');
var concat = require('gulp-concat');
var myth = require('gulp-myth');
var uglify = require('gulp-uglify');
var jshint = require('gulp-jshint');
var imagemin = require('gulp-imagemin');

// Styles Task
gulp.task('styles', function() {
return gulp.src('app/css/*.css')

// Scripts Task
gulp.task('scripts', function() {
return gulp.src('app/js/*.js')

// Images Task
gulp.task('images', function() {
return gulp.src('app/img/*')

// Watch Task
gulp.task('watch', function() {'app/css/*.css', 'styles');'app/js/*.js', 'scripts');'app/img/*', 'images');

// Default Task
gulp.task('default', gulp.parallel('styles', 'scripts', 'images', 'watch'));

If I run the
task alone it works. I had to add the
in the tasks - this wasn't in the book but googling showed me this was required.

The problem I have is that the
task errors:

[18:41:59] Error: watching app/css/*.css: watch task has to be a function (optionally generated by using gulp.parallel or gulp.series)
at (/media/sf_VM_Shared_Dev/webdevadvlocal/gulp/public_html/gulp-book/node_modules/gulp/index.js:28:11)
at /media/sf_VM_Shared_Dev/webdevadvlocal/gulp/public_html/gulp-book/gulpfile.js:36:10
at taskWrapper (/media/sf_VM_Shared_Dev/webdevadvlocal/gulp/public_html/gulp-book/node_modules/undertaker/lib/set-task.js:13:15)
at bound (domain.js:287:14)
at runBound (domain.js:300:12)
at asyncRunner (/media/sf_VM_Shared_Dev/webdevadvlocal/gulp/public_html/gulp-book/node_modules/async-done/index.js:36:18)
at nextTickCallbackWith0Args (node.js:419:9)
at process._tickCallback (node.js:348:13)
at Function.Module.runMain (module.js:444:11)
at startup (node.js:136:18)

I think it is because there is also no
in the watch task. Also the error message isn't clear - at least to me. I tried adding a
after the last
but that didn't work either.

Answer Source

In gulp 3.x you could just pass the name of a task to like this:

gulp.task('watch', function() {'app/css/*.css', ['styles']);'app/js/*.js', ['scripts']);'app/img/*', ['images']);

In gulp 4.x this is no longer the case. You have to pass a function. The customary way of doing this in gulp 4.x is to pass a gulp.series() invocation with only one task name. This returns a function that only executes the specified task:

gulp.task('watch', function() {'app/css/*.css', gulp.series('styles'));'app/js/*.js', gulp.series('scripts'));'app/img/*', gulp.series('images'));