Gulps gulp.watch yeni veya silinmiş dosyalar için tetiklenmedi mi?


151

Aşağıdaki Gulpjs görevi, glob eşleşmesinde dosyaları düzenlerken iyi çalışır:

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

Ancak yeni veya silinmiş dosyalar için çalışmaz (tetiklenmez). Kaçırdığım bir şey var mı?

EDIT : grunt-watch eklentisi kullanarak bile çalışmıyor gibi görünüyor:

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 : Çözüldü, bu sorun oldu . Globs ile başlayan ./(değeri src) ATM çalışmıyor gibi görünüyor.


2
Kabul edilen cevabı Nestor Urquiza'dan değiştirirseniz harika olur. Ek bir eklenti eklemek yerine burada gerçek cevap
Justin Noel

@alexk tarafından verilen cevap en basitiydi ve eklenmesi gerekmedi gulp-watch, örneğingulp.watch('js/**/*.js', {cwd: src}, ['scripts']);
Horse

Yanıtlar:


130

Düzenleme: Görünüşe göre gulp.watchşimdi yeni veya silinmiş dosyalarla çalışır. Soru sorulduğunda olmadı.

Cevabımın geri kalanı hala duruyor: gulp-watchsadece daha iyi bir çözümdür, çünkü yalnızca değiştirilmiş dosyalarda belirli eylemleri gerçekleştirmenize gulp.watchizin verirken, yalnızca tam görevleri çalıştırmanıza izin verir. Makul büyüklükteki bir proje için bu, yararlı olamayacak kadar yavaş olacaktır.


Hiçbir şey kaçırmıyorsunuz. gulp.watchyeni veya silinmiş dosyalarla çalışmaz. Basit projeler için tasarlanmış basit bir çözümdür.

, Yeni dosyalar için bakmak kullanabilirsiniz dosya izlemeye almak için eklenti çok daha güçlüdür. Kullanım şöyle görünür:gulp-watch

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

Şahsen, ilk seçeneği tavsiye ederim. Bu, dosya başına çok daha hızlı işlemlere izin verir. Herhangi bir dosyayı birleştirmediğiniz sürece karaciğer yükü ile geliştirme sırasında harika çalışır.

Ya kullanarak akışları paketleyebilirim benim lazypipekütüphane , ya da sadece bir fonksiyonu kullanarak ve stream-combinerbunun gibi:

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

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

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

GÜNCELLEME 15 Ekim 2014

Aşağıdaki @ pkyeck'in işaret ettiği gibi, görünüşe göre 1.0 sürümü gulp-watch, formatı biraz değiştirdi, bu nedenle yukarıdaki örnekler şimdi şöyle olmalıdır:

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

ve

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

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

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

Yardımın için teşekkürler ama yine de işe yarayamıyorum. Gulp'te yeniyim (Grunt'u birkaç kez kullandım) ve belki de asıl görevim yanlış ... dunno. Güncellenmiş soruma bakın.
gremo

18
github.com/floatdrop/gulp-watch/issues/1 globs './' ile başlamıyor . Src değişkenim tam olarak '- /'. Sorunu buldum! Teşekkürler!
14'te gremo

1
Bu hatayı bulmak için iyi bir yakalama. Umarım başka biri gelirse yardımcı olacaktır!
OverZealous

@JHannes Neye cevap veriyorsunuz? Bu cevabın açıklaması budur.
OverZealous

2
gulp.start, herkese açık olmayan bir API yöntemine yapılan bir çağrıdır. Görevleri yürütmenin başka bir yolu var mı?
Richard Collette

87

Hem gulp.watch()ve require('gulp-watch')()mutlak dizinleri kullandığımda yeni / ancak dosyaları değil silindi için tetikleyecektir. Testlerimde "./"göreli dizinler BTW için kullanmadım .

Tüm dizinler silinirse her ikisi de tetiklemez.

   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
Mükemmel ve basit bir cevap.
Edgar Martinez

3
yup - o kadar çok yudum örneği ./yollarında başlıyor - aslında kötü bir uygulama gibi görünüyor - github.com/floatdrop/gulp-watch/issues/1
rmorse

1
Bunun için teşekkür ederim. Beynimi gulp-watchyeni dosyalarda veya silinen dosyalarda tetiklemek için düzgün çalışmaya çalışıyordum . Gerek yok! gulp.watchbunu yapar. Tüm ./yollardan kaldırıldığında sorunlar giderildi. Muhteşem.
Qodesmith

2
Bu muhtemelen doğru cevap olmalı - izlemek için başka bir eklenti yüklemeyi gerçekten süslemiyordu. Tüm kürelerimden ./ kaldırıldı ve mükemmel çalıştı! Teşekkürler!
0Neji

1
Bu en iyi cevaptır, ekstra modül gerekmez veya çılgın sözdiziminin anlaşılmasıdır.
realappie

57

Eğer srcmutlak yol (ile başlıyor /), kodunuz yeni veya silinmiş dosyaları tespit etmek için gitmiyor. Ancak yine de bir yolu var:

Onun yerine:

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

yazmak:

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

ve işe yarayacak!


12
{ cwd: src }İpucu benim çözüm oldu. Çok teşekkür ederim!
wiredolphin

1
Çok teşekkürler @alexk, {cwd: src} sorunumu çözdü.
kaxi1993

@DanielTonon yanlışlıkla bir dizi dosyaya girdiniz mi? doğrudan bir parametre olmalıdırwatch
Horse

Bir dizide olamaz mı? Bu berbat bir şey. İstisnalar ne olacak? Kaynak dosyaları bir diziye koymadan hariç tutma ile gobbing yapmak mümkün değildir.
Daniel Tonon

4
Mükemmel cevap. Daha fazla eklemek için, her glob desenini değiştirmek istemiyorsanız {cwd:'./'}, glob desenini olduğu gibi ekleyin ve bırakıngulp.watch('src/js/**/*.js', {cwd: './'}, ['scripts']);
Akash

7

Globların ayrı bir temel dizini belirtilmiş olmalı ve bu temel konum globun kendisinde belirtilmemelidir.

Eğer varsa lib/*.js, şu anki çalışma direktifinin altına bakacaktır.process.cwd()

Gulp, dosyaları izlemek için Gaze'yi kullanır ve Gulp API belgesinde , Gaze'ye özgü seçenekleri saat işlevine geçirebileceğimizi görüyoruz:gulp.watch(glob[, opts], tasks)

Şimdi Gaze belgesinde mevcut çalışma direktifinin (glob base dir) cwdseçenek olduğunu görebiliriz.

Bu da bizi alexk'ın cevabına götürüyor: gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);


3

Bunun daha eski bir soru olduğunu biliyorum, ama bulduğum çözümü atacağımı düşündüm. Bulduğum gulp eklentilerinin hiçbiri yeni veya yeniden adlandırılmış dosyaları bana bildirmez. Bu yüzden, monoklleri bir kolaylık fonksiyonuna sardım.

İşte bu işlevin nasıl kullanıldığına dair bir örnek:

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

GulpStart'ın da yaptığım bir kolaylık işlevi olduğunu belirtmeliyim.

Ve işte gerçek saat modülü.

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

Çok basit, ha? Her şeyi yudum başlangıç ​​kitimde bulabilirsiniz: https://github.com/chrisdavies/gulp_starter_kit


1
Hey dostum, bunun için yeterli insan yok! Bir cazibe gibi çalışır, çok teşekkür ederim. (Cevap "gulpStart" ın ne yaptığını dışarıda bırakır, bu yüzden herkes ilgilenirse kafa karıştırıcı olabilir, sadece bağlantıyı ziyaret edin ve utilsklasöre gidin)
Augie Gardner


0

Gulp.watch yerine yeni / yeniden adlandırılmış / silinmiş dosyalar için 'gulp-watch' kullanmalısınız

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));
    });
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.