Gulps gulp.watch nie został uruchomiony dla nowych lub usuniętych plików?


151

Następujące zadanie Gulpjs działa dobrze podczas edycji plików w dopasowaniu globalnym:

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

Jednak to nie działa (nie jest wyzwalane) dla nowych lub usuniętych plików. Czy jest coś, czego mi brakuje?

EDYCJA : nawet przy użyciu wtyczki grunt-watch wydaje się nie działać:

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

EDYCJA : rozwiązany, to był ten problem . Globy zaczynające się od ./(taka była wartość src) wydaje się nie działać ATM.


2
Byłoby wspaniale, gdybyś zmienił zaakceptowaną odpowiedź na tę od Nestora Urquizy. To prawdziwa odpowiedź, a nie dodawanie dodatkowej wtyczki
Justin Noel

odpowiedź @alexk była najprostsza i nie wymagała dodania gulp-watchnp.gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);
Koń

Odpowiedzi:


130

Edycja: Najwyraźniej gulp.watchdziała teraz z nowymi lub usuniętymi plikami. Tak się nie stało, gdy zadano pytanie.

Reszta mojej odpowiedzi jest nadal aktualna: gulp-watchjest zwykle lepszym rozwiązaniem, ponieważ pozwala wykonywać określone czynności tylko na zmodyfikowanych plikach, a jednocześnie gulp.watchpozwala wykonywać tylko kompletne zadania. W przypadku projektu o rozsądnych rozmiarach szybko stanie się to zbyt wolne, aby było przydatne.


Niczego nie brakuje. gulp.watchnie działa z nowymi lub usuniętymi plikami. To proste rozwiązanie przeznaczone do prostych projektów.

Aby uzyskać plik oglądanie że mogą szukać nowych plików, korzystania z gulp-watchwtyczki , która jest o wiele bardziej wydajny. Sposób użycia wygląda następująco:

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

Osobiście polecam pierwszą opcję. Pozwala to na znacznie szybsze procesy na plik. Działa świetnie podczas programowania z livereload, o ile nie łączysz żadnych plików.

Możesz podsumować swoje strumienie za pomocą mojej lazypipebiblioteki lub po prostu używając funkcji i stream-combinertak:

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

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

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

AKTUALIZACJA 15 października 2014 r

Jak wskazał @pkyeck poniżej, najwyraźniej wersja 1.0 gulp-watchnieznacznie zmieniła format, więc powyższe przykłady powinny teraz wyglądać tak:

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

i

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

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

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

Dziękuję za pomoc, ale nadal nie mogę tego uruchomić. Jestem nowy w Gulp (kilka razy użyłem Grunta) i może moje główne zadanie jest złe ... nie wiem. Zobacz moje zaktualizowane pytanie.
gremo

18
github.com/floatdrop/gulp-watch/issues/1 globs zaczynające się od „./” nie emitują. Moja zmienna src to dokładnie „- /”. Znalazłem problem! Dzięki!
gremo

1
Dobry chwyt w znalezieniu tego błędu. Miejmy nadzieję, że pomoże, jeśli ktoś go spotka!
OverZealous

@JHannes Na co odpowiadasz? To właśnie wyjaśnia ta odpowiedź.
OverZealous

2
gulp.start to wywołanie niepublicznej metody API. Czy istnieje inny sposób wykonywania zadań?
Richard Collette

87

Oba gulp.watch()i require('gulp-watch')()będą wyzwalane dla nowych / usuniętych plików, jednak nie, jeśli używasz katalogów bezwzględnych. W moich testach nie "./"używałem przy okazji katalogów względnych.

Oba nie zostaną wyzwolone, jeśli zostaną usunięte całe katalogi.

   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
Doskonała i prosta odpowiedź.
Edgar Martinez

3
tak - tak wiele przykładów zaczyna się ./na ich ścieżkach - w rzeczywistości wydaje się to złą praktyką - github.com/floatdrop/gulp-watch/issues/1
rmorse

1
Dziękuję Ci za to. Po prostu męczyłem mózg, próbując uruchomić gulp-watchpoprawnie nowe pliki lub usunięte pliki. Nie ma potrzeby! gulp.watchrobi to. Usunięcie wszystkich ./ze ścieżek rozwiązało problemy. Niesamowite.
Qodesmith

2
To prawdopodobnie powinna być właściwa odpowiedź - tak naprawdę nie miałem ochoty instalować kolejnej wtyczki do obejrzenia. Usunąłem ./ ze wszystkich moich globów i działało idealnie! Dzięki!
0Neji

1
To najlepsza odpowiedź, nie potrzeba dodatkowego modułu ani zrozumienia szalonej składni.
realappie

57

Jeśli srcjest to ścieżka bezwzględna (zaczynająca się od /), kod nie wykryje nowych ani usuniętych plików. Jednak wciąż jest sposób:

Zamiast:

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

pisać:

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

i będzie działać!


12
{ cwd: src }Wskazówkę było moje rozwiązanie. Dziękuję Ci bardzo!
wiredolphin

1
Wielkie dzięki @alexk, {cwd: src} rozwiązało mój problem.
kaxi1993

@DanielTonon Czy przez pomyłkę umieściłeś wewnątrz tablicy plików? powinien być bezpośrednim parametremwatch
Horse

Nie może być w tablicy? Cóż, to jest do bani. A co z wykluczeniami? Niemożliwe jest gobbing z wykluczeniami bez umieszczania plików źródłowych w tablicy.
Daniel Tonon,

4
Świetna odpowiedź. Aby dodać więcej, jeśli nie chcesz zmieniać każdego wzorca globu, po prostu dodaj {cwd:'./'}i pozostaw wzór glob taki, jaki byłgulp.watch('src/js/**/*.js', {cwd: './'}, ['scripts']);
Akash

7

Globy muszą mieć określony oddzielny katalog podstawowy, a tej lokalizacji podstawowej nie można określać w samym globie.

Jeśli tak lib/*.js, będzie wyglądał pod bieżącym katalogiem roboczym, którym jestprocess.cwd()

Gulp używa Gaze do oglądania plików, aw dokumencie API Gulp widzimy, że możemy przekazać określone opcje Gaze do funkcji watch:gulp.watch(glob[, opts], tasks)

Teraz w dokumencie Gaze możemy znaleźć, że bieżący katalog roboczy (glob base dir) jest cwdopcją.

Co prowadzi nas do odpowiedzi Alexka: gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);


3

Wiem, że to starsze pytanie, ale pomyślałem, że rzucę rozwiązanie, które wymyśliłem. Żadna z wtyczek gulp, które znalazłem, nie powiadamia mnie o nowych lub zmienionych nazwach plików. Skończyło się na tym, że owijałem monokl w wygodną funkcję.

Oto przykład użycia tej funkcji:

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

Powinienem zauważyć, że gulpStart to również funkcja wygody, którą stworzyłem.

A oto rzeczywisty moduł zegarka.

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

Całkiem proste, co? Całość można znaleźć w moim zestawie startowym z łykiem: https://github.com/chrisdavies/gulp_starter_kit


1
Hej kolego, za mało ludzi dało rekwizyty! To działa jak urok, dziękuję bardzo. (W odpowiedzi pomija się, co robi „gulpStart”, więc może to być mylące, jeśli ktoś jest zainteresowany, po prostu odwiedź link i przejdź do utilsfolderu)
Augie Gardner


0

Powinieneś używać „gulp-watch” dla nowych / zmienionych nazw / usuniętych plików zamiast gulp.watch

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));
    });
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.