Errore di Gulp: l'attività di controllo deve essere una funzione


126

Ecco il mio 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'));

Se corro il images, scriptso csscompito da sola funziona. Ho dovuto aggiungere il returnnelle attività - questo non era nel libro ma googling mi ha mostrato che era necessario.

Il problema che ho è che gli defaulterrori dell'attività:

[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)

Penso che sia perché non c'è nemmeno returnl'attività di vigilanza. Anche il messaggio di errore non è chiaro, almeno per me. Ho provato ad aggiungere un returndopo l'ultimo gulp.watch()ma non ha funzionato neanche.

Risposte:


354

In gulp 3.x potresti semplicemente passare il nome di un'attività in gulp.watch()questo modo:

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 non è più così. È necessario passare una funzione. Il modo consueto per farlo in gulp 4.x è passare una gulp.series()chiamata con un solo nome di attività. Restituisce una funzione che esegue solo l'attività specificata:

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'));
});

13
Quindi una serie di una funzione ... un po 'strano non è vero?
MonsieurNinja

Grazie ... // guarda 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
È rimasto bloccato finché non mi sono reso conto stylesdi gulp.series('styles'));una funzione. Nel mio caso l'avevo sassdefinita come una funzione, ma ho preso quello che c'era nel ( )come destinazione. Per chiunque abbia seguito i tutorial "Gulp for Beginners" e sia rimasto bloccato, la soluzione è sostituire la riga gulp.watch('app/scss/**/*.scss', ['sass']);congulp.watch('app/sass/**/*.sass', gulp.series('sass'));
YCode

Qual è la differenza tra gulp.watch('app/sass/**/*.sass', gulp.series('sass'));e gulp.watch('app/sass/**/*.sass', gulp.series['sass']);? Ho provato entrambe le linee e non ho visto alcun cambiamento, ma sono sicuro che ci sia una differenza (che mi perseguiterà più tardi).
YCode

19

grazie di tutto

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

per la versione gulp 4.xx


Dovrebbe esseregulp.series('sass')
Tony Bui

No, non è necessario che sia una serie se è solo un compito.
Vortilion

18

GULP-V4.0

È un po 'tardi per rispondere adesso, ma ancora. Anch'io ero bloccato in questo problema ed è così che l'ho fatto funzionare. Struttura Gulp

In dettaglio analisi cosa stavo facendo di sbagliato

  1. Ho dimenticato di chiamare la funzione di ricarica quando ho watchnotato alcuni cambiamenti nei miei file html.
  2. Da allora fireUpe KeepWatchingstanno bloccando. Devono essere avviati in parallelo piuttosto che in serie. Quindi ho usato la funzione parallela nella variabile run.

4

Ha funzionato per me in Gulp 4.0

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'));
});

0

// Controlla cosa ha funzionato per me

gulp.task('watch', function(){
    gulp.watch('css/shop.css', gulp.series(['shop']));
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.