Gulps gulp.watch nicht für neue oder gelöschte Dateien ausgelöst?


151

Die folgende Gulpjs-Aufgabe funktioniert einwandfrei, wenn Sie Dateien in der Glob-Übereinstimmung bearbeiten:

// watch task.
gulp.task('watch', ['build'], function () {
    gulp.watch(src + '/js/**/*.js', ['scripts']);
    gulp.watch(src + '/img//**/*.{jpg,jpeg,png,gif}', ['copy:images']);
    gulp.watch(src + '/less/*.less', ['styles']);
    gulp.watch(src + '/templates/**/*.{swig,json}', ['html']);
});

// build task.
gulp.task('build', ['clean'], function() {
    return gulp.start('copy', 'scripts', 'less', 'htmlmin');
});

Es funktioniert jedoch nicht (es wird nicht ausgelöst) für neue oder gelöschte Dateien. Fehlt mir etwas?

EDIT : Selbst mit dem Grunt-Watch-Plugin scheint es nicht zu funktionieren:

gulp.task('scripts', function() {
    return streamqueue(
        { objectMode: true },
        gulp.src([
            vendor + '/jquery/dist/jquery.min.js',
            vendor + '/bootstrap/dist/js/bootstrap.min.js'
        ]),
        gulp.src([
            src + '/js/**/*.js'
        ]).pipe(plugins.uglify())
    )
    .pipe(plugins.concat(pkg.name + '.min.js'))
    .pipe(gulp.dest(dest + '/js/'));
});

gulp.task('watch', ['build'], function () {
    plugins.watch({glob: src + '/js/**/*.js'}, function () {
        gulp.start('scripts');
    });
});

EDIT : Gelöst, es war dieses Problem . Globs, die mit ./(das war der Wert von src) beginnen, scheinen nicht am Geldautomaten zu funktionieren.


2
Wäre toll, wenn Sie die akzeptierte Antwort in die von Nestor Urquiza ändern würden. Es ist die eigentliche Antwort hier, anstatt ein zusätzliches Plugin hinzuzufügen
Justin Noel

Die Antwort von @alexk war die einfachste und erforderte nicht die Hinzufügung von gulp-watchzBgulp.watch('js/**/*.js', {cwd: src}, ['scripts']);
Horse

Antworten:


130

Bearbeiten: Funktioniert anscheinend gulp.watchjetzt mit neuen oder gelöschten Dateien. Es war nicht so, als die Frage gestellt wurde.

Der Rest meiner Antwort bleibt bestehen: gulp-watchist normalerweise eine bessere Lösung, da Sie damit bestimmte Aktionen nur für die geänderten Dateien ausführen können, während gulp.watchSie nur vollständige Aufgaben ausführen können. Für ein Projekt von angemessener Größe wird dies schnell zu langsam, um nützlich zu sein.


Ihnen fehlt nichts. gulp.watchfunktioniert nicht mit neuen oder gelöschten Dateien. Es ist eine einfache Lösung für einfache Projekte.

Verwenden Sie das gulp-watchPlugin , das viel leistungsfähiger ist, damit Dateien nach neuen Dateien gesucht werden können. Die Verwendung sieht folgendermaßen aus:

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

// in a task
watch({glob: <<glob or array of globs>> })
        .pipe( << add per-file tasks here>> );

// if you'd rather rerun the whole task, you can do this:
watch({glob: <<glob or array of globs>>}, function() {
    gulp.start( <<task name>> );
});

Persönlich empfehle ich die erste Option. Dies ermöglicht viel schnellere Prozesse pro Datei. Es funktioniert hervorragend während der Entwicklung mit Livereload, solange Sie keine Dateien verketten.

Sie können Ihre Streams entweder über meine lazypipeBibliothek oder einfach über eine Funktion und stream-combinerwie folgt abschließen:

var combine = require('stream-combiner');

function scriptsPipeline() {
    return combine(coffeeescript(), uglify(), gulp.dest('/path/to/dest'));
}

watch({glob: 'src/scripts/**/*.js' })
        .pipe(scriptsPipeline());

UPDATE 15. Oktober 2014

Wie von @pkyeck unten ausgeführt, hat anscheinend die Version 1.0 gulp-watchdas Format geringfügig geändert, sodass die obigen Beispiele nun lauten sollten:

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

// in a task
watch(<<glob or array of globs>>)
        .pipe( << add per-file tasks here>> );

// if you'd rather rerun the whole task, you can do this:
watch(<<glob or array of globs>>, function() {
    gulp.start( <<task name>> );
});

und

var combine = require('stream-combiner');

function scriptsPipeline() {
    return combine(coffeeescript(), uglify(), gulp.dest('/path/to/dest'));
}

watch('src/scripts/**/*.js')
        .pipe(scriptsPipeline());

Vielen Dank für Ihre Hilfe, aber ich kann es immer noch nicht zum Laufen bringen. Ich bin neu in Gulp (ich habe Grunt ein paar Mal benutzt) und vielleicht ist meine Hauptaufgabe falsch ... keine Ahnung. Siehe meine aktualisierte Frage.
Gremo

18
github.com/floatdrop/gulp-watch/issues/1 Globs, die mit './' beginnen und nicht emittieren. Meine src-Variable ist genau '- /'. Hab das Problem gefunden! Vielen Dank!
Gremo

1
Guter Fang, um diesen Fehler zu finden. Hoffentlich hilft es, wenn jemand anderes darauf stößt!
OverZealous

@JHannes Worauf antwortest du? Das erklärt diese Antwort.
OverZealous

2
gulp.start ist ein Aufruf einer nicht öffentlichen API-Methode. Gibt es eine andere Möglichkeit, Aufgaben auszuführen?
Richard Collette

87

Beides gulp.watch()und require('gulp-watch')()wird für neue / gelöschte Dateien ausgelöst, jedoch nicht, wenn Sie absolute Verzeichnisse verwenden. In meinen Tests habe ich übrigens nicht "./"für relative Verzeichnisse verwendet.

Beide werden jedoch nicht ausgelöst, wenn ganze Verzeichnisse gelöscht werden.

   var watch = require('gulp-watch');
   //Wont work for new files until gaze is fixed if using absolute dirs. It  won't trigger if whole directories are deleted though.
   //gulp.watch(config.localDeploy.path + '/reports/**/*', function (event) {

   //gulp.watch('src/app1/reports/**/*', function (event) {
   // console.log('*************************** Event received in gulp.watch');
   // console.log(event);
   // gulp.start('localDeployApp');
   });

   //Won't work for new files until gaze is fixed if using absolute dirs. It  won't trigger if whole directories are deleted though. See https://github.com/floatdrop/gulp-watch/issues/104
   //watch(config.localDeploy.path + '/reports/**/*', function() {

   watch('src/krfs-app/reports/**/*', function(event) {
      console.log("watch triggered");
      console.log(event);
      gulp.start('localDeployApp');
   //});

2
Hervorragende und einfache Antwort.
Edgar Martinez

3
yup - so viele Schluckbeispiele da draußen beginnen ./auf ihren Wegen - eigentlich scheint es eine schlechte Praxis zu sein - github.com/floatdrop/gulp-watch/issues/1
rmorse

1
Danke dafür. Ich habe mir nur den Kopf zerbrochen und versucht, gulp-watchrichtig zu arbeiten, um neue oder gelöschte Dateien auszulösen. Das ist nicht nötig! gulp.watchmacht dies. Durch Entfernen aller Elemente ./aus den Pfaden wurden Probleme behoben. Genial.
Der Qodesmith

2
Dies sollte wahrscheinlich die richtige Antwort sein - ich hatte nicht wirklich Lust, ein anderes Plugin zu installieren, um es mir anzusehen. Entfernte die ./ von allen meinen Globs und funktionierte perfekt! Vielen Dank!
0Neji

1
Dies ist die beste Antwort, kein zusätzliches Modul erforderlich oder Verständnis für verrückte Syntax.
Realappie

57

Wenn srces sich um einen absoluten Pfad handelt (beginnend mit /), erkennt Ihr Code keine neuen oder gelöschten Dateien. Es gibt jedoch noch einen Weg:

Anstatt:

gulp.watch(src + '/js/**/*.js', ['scripts']);

schreiben:

gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);

und es wird funktionieren!


12
Der { cwd: src }Hinweis war meine Lösung. Vielen Dank!
Wiredolphin

1
Vielen Dank @alexk, {cwd: src} hat mein Problem gelöst.
kaxi1993

@DanielTonon haben Sie versehentlich in ein Array von Dateien eingefügt? sollte ein direkter Parameter vonwatch
Pferd

Es kann nicht in einem Array sein? Nun, das ist scheiße. Was ist mit Ausschlüssen? Es ist nicht möglich, mit Ausschlüssen zu verschlingen, ohne die Quelldateien in einem Array abzulegen.
Daniel Tonon

4
Gute Antwort. Um weiter hinzuzufügen, wenn Sie nicht jedes Glob-Muster ändern möchten, fügen Sie einfach {cwd:'./'}das Glob-Muster hinzu und lassen Sie es so, wie es sein würdegulp.watch('src/js/**/*.js', {cwd: './'}, ['scripts']);
Akash

7

Für Globs muss ein separates Basisverzeichnis angegeben werden, und dieser Basisverzeichnis darf nicht im Glob selbst angegeben werden.

Wenn Sie haben lib/*.js, wird es unter dem aktuellen Arbeitsverzeichnis angezeigtprocess.cwd()

Gulp verwendet Gaze zum Überwachen von Dateien. Im Gulp-API-Dokument sehen wir, dass wir Gaze-spezifische Optionen an die Überwachungsfunktion übergeben können:gulp.watch(glob[, opts], tasks)

Jetzt können wir im Gaze-Dokument feststellen, dass das aktuelle Arbeitsverzeichnis (glob base dir) die cwdOption ist.

Was uns zu Alexks Antwort führt: gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);


3

Ich weiß, dass dies eine ältere Frage ist, aber ich dachte, ich würde die Lösung werfen, die ich mir ausgedacht habe. Keines der gefundenen gulp-Plugins würde mich über neue oder umbenannte Dateien informieren. Also habe ich Monokel in eine Convenience-Funktion eingewickelt.

Hier ist ein Beispiel für die Verwendung dieser Funktion:

watch({
    root: config.src.root,
    match: [{
      when: 'js/**',
      then: gulpStart('js')
    }, {
      when: '+(scss|css)/**',
      then: gulpStart('css')
    }, {
      when: '+(fonts|img)/**',
      then: gulpStart('assets')
    }, {
      when: '*.+(html|ejs)',
      then: gulpStart('html')
    }]
  });

Ich sollte beachten, dass gulpStart auch eine von mir erstellte Komfortfunktion ist.

Und hier ist das eigentliche Uhrenmodul.

module.exports = function (options) {
  var path = require('path'),
      monocle = require('monocle'),
      minimatch = require('minimatch');

  var fullRoot = path.resolve(options.root);

  function onFileChange (e) {
    var relativePath = path.relative(fullRoot, e.fullPath);

    options.match.some(function (match) {
      var isMatch = minimatch(relativePath, match.when);
      isMatch && match.then();
      return isMatch;
    });
  }

  monocle().watchDirectory({
    root: options.root,
    listener: onFileChange
  });
};

Ziemlich einfach, oder? Das Ganze finden Sie in meinem Gulp Starter Kit: https://github.com/chrisdavies/gulp_starter_kit


1
Hey Kumpel, nicht genug Leute haben Requisiten dafür gegeben! Es funktioniert wie ein Zauber, vielen Dank. (Die Antwort lässt aus, was "gulpStart" macht, so dass es verwirrend sein kann, wenn jemand interessiert ist, besuchen Sie einfach den Link und gehen Sie zum utilsOrdner)
Augie Gardner


0

Sie sollten 'gulp-watch' für neue / umbenannte / gelöschte Dateien anstelle von gulp.watch verwenden

var gulpwatch = require('gulp-watch');
var source = './assets',  
destination = './dest';
gulp.task('copy-changed-assets', function() {
    gulpwatch(source+'/**/*', function(obj){
        gulp.src( obj.path, { "base": source})
        .pipe(gulp.dest(destination));
    });
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.