web-dev-qa-db-fra.com

Exécution d'une tâche existante avec gulp-watch

J'ai des tâches déjà définies dans gulpfile.js Et je veux utiliser le plugin gulp-watch (Pour exécuter des tâches sur de nouveaux fichiers). Ma question est, parce que je n'ai rien trouvé, puis-je exécuter mes tâches existantes tout en exécutant la fonction de surveillance (à partir du plugin)?

var gulp = require('gulp'),
    watch = require('gulp-watch'),
    ...;

gulp.task('lint', function () {
  return gulp.src(path.scripts)
      .pipe(jshint())
      .pipe(jshint.reporter(stylish));
});

gulp.task('watch', function () {
  watch({ glob: 'app/**/*.js' }); // Run 'lint' task for those files
});

Parce que je ne veux pas inclure la tâche watch() dans chaque tâche que j'ai. Je voudrais avoir une seule tâche - regarder, qui combinera toutes les "montres".

----- EDIT ---- (car je n'ai probablement pas tout à fait compris):

J'ai besoin d'exécuter la tâche depuis l'intérieur de la tâche gulp('watch'). par exemple:

comme je l'ai fait avec gulp.watch:

gulp.task('watch', function () {
  gulp.watch('files', ['task1', 'task2']);
});

Je dois faire de même mais avec le plugin gulp-watch, Quelque chose comme (je sais que cela ne fonctionnerait pas):

var watch = require('gulp-watch');

gulp.task('watch', function () {
  watch({ glob: 'files' }, ['task1', 'task2']);
});
21
Tomasz Kasperek

J'ai également rencontré le problème de vouloir utiliser gulp-watch (pas gulp.watch), d'avoir besoin d'utiliser le formulaire de rappel et d'avoir du mal à trouver un moyen approprié d'exécuter une tâche dans le rappel.

Mon cas d'utilisation était que je voulais regarder tous les fichiers de stylet, mais ne traiter que le fichier de stylet principal qui inclut tous les autres. Les nouvelles versions de gulp-watch peuvent résoudre ce problème mais j'ai des problèmes avec 4.3.x donc je suis bloqué sur 4.2.5.

  • gulp.run est obsolète, donc je ne veux pas l'utiliser.
  • gulp.start fonctionne bien, mais est également déconseillé par l'auteur de gulp, contra.
  • Le plugin run-sequence fonctionne bien et vous permet de définir un ordre d'exécution, mais il s'agit d'un hack auto-proclamé: https://www.npmjs.com/package/run-sequence
  • Contra suggère d'écrire de vieilles fonctions simples et de les appeler. C'est une nouvelle idée pour moi, mais je pense que l'exemple ci-dessous capture l'idée. https://github.com/gulpjs/gulp/issues/505

Faites votre choix.

var gulp = require('gulp'),
    watch = require('gulp-watch'), // not gulp.watch
    runSequence = require('run-sequence');

// plain old js function
var runStylus = function() {
    return gulp.src('index.styl')
        .pipe(...) // process single file
}

gulp.task('stylus', runStylus);

gulp.task('watch', function() {
    // watch many files
    watch('*.styl', function() {
        runSequence('stylus');
        OR 
        gulp.start('stylus');
        OR
        runStylus();
    });
});

Tous ces éléments fonctionnent pour moi sans avertissements, mais je ne suis toujours pas sûr d'obtenir le rappel "terminé" de la version 4.2.x de gulp-watch.

24
AgentOrange

Vous souhaiterez probablement exécuter des tâches spécifiques liées aux fichiers que vous regardez -

gulp.task('watch',['lint'], function () {
    gulp.watch('app/**/*.js' , ['lint']);
});

Vous pouvez également utiliser le ['lint'] partie pour exécuter toutes les tâches requises lors de l'appel initial de watch, ou utiliser les tâches pour exécuter async avec

gulp.task('default', ['lint','watch'])
13
Kelly J Andrews

Vous pouvez simplement appeler une tâche, qui comprend ensuite les deux tâches

gulp.task('default', ['lint','watch'])

alors ici, vous appelleriez simplement "gulp"

7
Andrew C
gulp.task('watch', function() {
  watch(files, function() {
    gulp.run(['task1', 'task2']);
  });
});

fonctionne bien, sauf un avertissement

4
gongqj