Gulp-Fehler: Watch-Aufgabe muss eine Funktion sein

125

Hier ist meine 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')
        .pipe(concat('all.css'))
        .pipe(myth())
        .pipe(gulp.dest('dist'));
});

// Scripts Task
gulp.task('scripts', function() {
    return gulp.src('app/js/*.js')
        .pipe(jshint())
        .pipe(jshint.reporter('default'))
        .pipe(concat('all.js'))
        .pipe(uglify())
        .pipe(gulp.dest('dist'));
});

// Images Task
gulp.task('images', function() {
    return gulp.src('app/img/*')
        .pipe(imagemin())
        .pipe(gulp.dest('dist/img'));
});

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

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

Wenn ich das oder die Aufgabe alleine ausführe images, funktioniert es. Ich musste das in den Aufgaben hinzufügen - das war nicht im Buch, aber googeln zeigte mir, dass dies erforderlich war.scriptscssreturn

Das Problem, das ich habe, ist, dass die defaultAufgabe Fehler:

[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 Gulp.watch (/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)

Ich denke es liegt daran, dass es auch keine returnin der Watch-Aufgabe gibt. Auch die Fehlermeldung ist nicht klar - zumindest für mich. Ich habe versucht, ein returnnach dem letzten hinzuzufügen, gulp.watch()aber das hat auch nicht funktioniert.

Arnold Rimmer
quelle

Antworten:

351

In gulp 3.x können Sie einfach den Namen einer Aufgabe so übergeben, dass sie Ihnen gulp.watch()gefällt:

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

In gulp 4.x ist dies nicht mehr der Fall. Sie müssen eine Funktion übergeben. Die übliche Methode in gulp 4.x besteht darin, einen gulp.series()Aufruf mit nur einem Aufgabennamen zu übergeben. Dies gibt eine Funktion zurück, die nur die angegebene Aufgabe ausführt:

gulp.task('watch', function() {
  gulp.watch('app/css/*.css', gulp.series('styles'));
  gulp.watch('app/js/*.js', gulp.series('scripts'));
  gulp.watch('app/img/*', gulp.series('images'));
});
Sven Schönung
quelle
13
Also eine Reihe von einer Funktion ... ein bisschen seltsam, nicht wahr?
Monsieur
Vielen Dank ... // watch gulp.task ('watch', function () {gulp.watch ('src / images / *. Png', gulp.series ('images')); gulp.watch ('src /js/*.js ', gulp.series (' js ')); gulp.watch (' src / scss / *. scss ', gulp.series (' css ')); gulp.watch (' src / html /*.html ', gulp.series (' html '));});
Wasim Khan
1
Ich blieb stecken, bis mir klar styleswurde, dass gulp.series('styles'));es sich um eine Funktion handelt. In meinem Fall hatte ich sassals Funktion definiert, aber ich nahm, was in der ( )als Ziel war. Für alle, die den "Gulp for Beginners" gulp.watch('app/scss/**/*.scss', ['sass']);gulp.watch('app/sass/**/*.sass', gulp.series('sass'));
-Tutorials
Was ist der Unterschied zwischen gulp.watch('app/sass/**/*.sass', gulp.series('sass'));und gulp.watch('app/sass/**/*.sass', gulp.series['sass']);? Ich habe beide Linien getestet und keine Veränderung festgestellt, aber ich bin mir sicher, dass es einen Unterschied gibt (der mich später verfolgen wird).
YCode
18

Danke für alles

gulp.task('watch', function(){
    gulp.watch('app/sass/**/*.sass', gulp.series('sass'));
});

für die Version gulp 4.xx.

Alexandr Kutsenko
quelle
Es sollte seingulp.series('sass')
Tony Bui
Nein, es muss keine Serie sein, wenn es nur eine Aufgabe ist.
Vortilion
18

GULP-V4.0

Es ist ein bisschen spät, dies jetzt zu beantworten, aber immer noch. Ich war auch in diesem Problem gefangen und so habe ich es zum Laufen gebracht. Schluckstruktur

Im Detail analysieren, was ich falsch gemacht habe

  1. Ich habe vergessen, die Reload-Funktion aufzurufen, als ich watcheinige Änderungen in meinen HTML-Dateien bemerkte.
  2. Da fireUpund KeepWatchingblockieren. Sie müssen parallel und nicht seriell gestartet werden. Also habe ich die Parallelfunktion im Variablenlauf verwendet.
cafebabe1991
quelle
4

In Gulp 4.0 hat es bei mir funktioniert

gulp.task('watch', function() {
      gulp.watch('src/images/*.png', gulp.series('images'));
      gulp.watch('src/js/*.js', gulp.series('js'));
      gulp.watch('src/scss/*.scss', gulp.series('css'));
      gulp.watch('src/html/*.html', gulp.series('html'));
});
Wasim Khan
quelle
0

// Überprüfe was bei mir funktioniert hat

gulp.task('watch', function(){
    gulp.watch('css/shop.css', gulp.series(['shop']));
});
Ataki Stanley
quelle