Gulps gulp.watch tidak terpicu untuk file baru atau yang dihapus?

151

Tugas Gulpjs berikut berfungsi dengan baik saat mengedit file di pencocokan glob:

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

Namun tidak berfungsi (tidak terpicu) untuk file baru atau yang dihapus. Apakah ada sesuatu yang saya lewatkan?

EDIT : bahkan menggunakan plugin grunt-watch sepertinya tidak berfungsi:

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 : Dipecahkan, itu adalah masalah ini . Gumpalan dimulai dengan ./(itu nilai src) sepertinya tidak berfungsi ATM.

Gremo
sumber
2
Akan lebih bagus jika Anda mengubah jawaban yang diterima ke yang dari Nestor Urquiza. Ini jawaban nyata di sini daripada menambahkan plugin tambahan
Justin Noel
jawaban oleh @alexk adalah yang paling sederhana, dan tidak memerlukan tambahan gulp-watch, misalnyagulp.watch('js/**/*.js', {cwd: src}, ['scripts']);
Kuda

Jawaban:

130

Sunting: Tampaknya gulp.watchtidak berfungsi dengan file baru atau yang dihapus sekarang. Tidak ketika pertanyaan diajukan.

Sisa jawaban saya masih tetap: gulp-watchbiasanya merupakan solusi yang lebih baik karena memungkinkan Anda melakukan tindakan spesifik hanya pada file yang telah dimodifikasi, sementara gulp.watchhanya memungkinkan Anda menjalankan tugas lengkap. Untuk proyek dengan ukuran yang masuk akal, ini dengan cepat akan menjadi terlalu lambat untuk berguna.


Anda tidak melewatkan apa pun. gulp.watchtidak berfungsi dengan file baru atau yang dihapus. Ini adalah solusi sederhana yang dirancang untuk proyek-proyek sederhana.

Untuk mendapatkan file menonton yang dapat mencari file baru, gunakan yang gulp-watchPlugin , yang jauh lebih kuat. Penggunaannya terlihat seperti ini:

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

Secara pribadi, saya merekomendasikan opsi pertama. Ini memungkinkan proses per file yang jauh lebih cepat. Ini bekerja sangat baik selama pengembangan dengan memuat hati selama Anda tidak menggabungkan file apa pun.

Anda dapat membungkus aliran Anda menggunakan perpustakaan sayalazypipe , atau cukup menggunakan fungsi dan stream-combinerseperti ini:

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

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

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

PEMBARUAN 15 Oktober 2014

Seperti yang ditunjukkan oleh @pkyeck di bawah ini, ternyata rilis versi 1.0 gulp-watchsedikit mengubah formatnya, jadi contoh di atas seharusnya menjadi:

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

dan

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

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

watch('src/scripts/**/*.js')
        .pipe(scriptsPipeline());
Terlalu bersemangat
sumber
Terima kasih telah membantu tetapi tetap tidak bisa membuatnya bekerja. Saya baru mengenal Gulp (saya telah menggunakan Grunt beberapa kali) dan mungkin tugas utama saya salah ... tidak tahu. Lihat pertanyaan saya yang diperbarui.
gremo
18
github.com/floatdrop/gulp-watch/issues/1 gumpalan dimulai dengan './' tidak memancarkan. Variabel src saya persis '- /'. Menemukan masalahnya! Terima kasih!
gremo
1
Bagus menangkap bug itu. Semoga ini akan membantu jika ada orang lain yang menemukannya!
OverZealous
@JHannes Apa yang kamu balas? Itulah yang dijelaskan oleh jawaban ini.
senang
2
gulp.start adalah panggilan ke metode API non-publik. Apakah ada cara lain untuk menjalankan tugas?
Richard Collette
87

Keduanya gulp.watch()dan require('gulp-watch')()akan memicu untuk file baru / dihapus tetapi tidak jika Anda menggunakan direktori absolut. Dalam tes saya, saya tidak menggunakan "./"untuk direktori relatif BTW.

Keduanya tidak akan memicu jika seluruh direktori dihapus.

   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');
   //});
Nestor Urquiza
sumber
2
Jawaban yang bagus dan sederhana.
Edgar Martinez
3
yup - begitu banyak contoh tegukan di luar sana mulai dengan ./jalan mereka - sebenarnya sepertinya praktik yang buruk - github.com/floatdrop/gulp-watch/issues/1
rmorse
1
Terima kasih untuk ini. Saya hanya memutar otak untuk mencoba gulp-watchbekerja dengan baik untuk memicu pada file baru atau file yang dihapus. Tidak dibutuhkan! gulp.watchMelakukan hal ini. Menghapus semua ./dari jalur menyelesaikan masalah. Luar biasa.
The Qodesmith
2
Ini mungkin jawaban yang tepat - tidak terlalu suka menginstal plugin lain untuk ditonton. Menghapus ./ dari semua gumpalan saya dan bekerja dengan sempurna! Terima kasih!
0Neji
1
Ini adalah jawaban terbaik, tidak ada modul tambahan yang diperlukan atau pemahaman sintaksis gila.
realappie
57

Jika srcjalur absolut (dimulai dengan /), kode Anda tidak akan mendeteksi file baru atau yang dihapus. Namun masih ada jalan:

Dari pada:

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

menulis:

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

dan itu akan berhasil!

alexk
sumber
12
The { cwd: src }petunjuk adalah solusi saya. Terima kasih banyak!
wiredolphin
1
Terima kasih banyak @alexk, {cwd: src} menyelesaikan masalah saya.
kaxi1993
@DanielTonon apakah Anda memasukkan ke dalam array file secara tidak sengaja? harus menjadi parameter langsung dariwatch
Kuda
Itu tidak bisa dalam array? Yah itu menyebalkan. Bagaimana dengan pengecualian? Tidak mungkin melakukan gobbing dengan pengecualian tanpa menempatkan file sumber ke dalam array.
Daniel Tonon
4
Jawaban yang bagus Untuk menambahkan lebih lanjut, jika Anda tidak ingin mengubah setiap pola bola, cukup tambahkan {cwd:'./'}dan biarkan pola bola itu seperti gulp.watch('src/js/**/*.js', {cwd: './'}, ['scripts']);
semula
7

Glob harus memiliki direktori basis terpisah yang ditentukan dan lokasi basis itu tidak boleh ditentukan dalam glob itu sendiri.

Jika sudah lib/*.js, itu akan terlihat di bawah direktori kerja saat iniprocess.cwd()

Gulp menggunakan Gaze untuk menonton file dan dalam dokumen Gulp API kami melihat bahwa kami dapat meneruskan opsi spesifik Gaze ke fungsi arloji:gulp.watch(glob[, opts], tasks)

Sekarang dalam dokumen Gaze kita dapat menemukan bahwa dir yang berfungsi saat ini (glob base dir) adalah cwdopsi.

Yang mengarahkan kita ke jawaban alexk: gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);

Peter Perron
sumber
3

Saya tahu ini adalah pertanyaan yang lebih tua, tetapi saya pikir saya akan memberikan solusi yang saya temukan. Tidak ada plugin gulp yang saya temukan akan memberi tahu saya tentang file baru atau yang diganti nama. Jadi saya akhirnya membungkus kacamata berlensa dalam fungsi kenyamanan.

Berikut ini contoh bagaimana fungsi itu digunakan:

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

Saya harus mencatat bahwa gulpStart juga merupakan fungsi kenyamanan yang saya buat.

Dan di sini adalah modul arloji yang sebenarnya.

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

Cukup sederhana, bukan? Semuanya dapat ditemukan di starter kit gulp saya: https://github.com/chrisdavies/gulp_starter_kit

Christopher Davies
sumber
1
Hai teman, tidak cukup banyak orang yang memberikan alat peraga untuk ini! Ini berfungsi seperti pesona, terima kasih banyak. (Jawabannya tidak sesuai dengan apa yang dikatakan "gulpStart", sehingga dapat membingungkan, jika ada yang tertarik, cukup kunjungi tautan dan buka utilsfolder)
Augie Gardner
1

Penting untuk dicatat bahwa sepertinya gulp.watch hanya melaporkan file yang diubah dan dihapus pada Windows tetapi mendengarkan file baru dan yang dihapus secara default di OSX:

https://github.com/gulpjs/gulp/issues/675

Brian Ogden
sumber
0

Anda harus menggunakan 'gulp-watch' untuk file baru / yang diubah namanya / dihapus alih-alih 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));
    });
});
Jitendra Saroj
sumber