Gulps gulp.watch не запускается для новых или удаленных файлов?

Следующая задача Gulpjs отлично работает при редактировании файлов в матче:

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

Однако он не работает (не запускается) для новых или удаленных файлов. Что-то мне не хватает?

РЕДАКТИРОВАТЬ: даже с помощью плагина grunt-watch кажется, что он не работает:

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

РЕДАКТИРОВАТЬ: Решено, это было эта проблема. Глобы, начинающиеся с ./ (то есть значение src), похоже, не работают с ATM.

Ответ 1

Изменить: По-видимому gulp.watch теперь работает с новыми или удаленными файлами. Это не было, когда вопрос был задан.

Остальная часть моего ответа по-прежнему стоит: gulp-watch обычно является лучшим решением, поскольку оно позволяет выполнять определенные действия только для файлов, которые были изменены, а gulp.watch позволяет запускать полные задачи. Для проекта разумного размера это быстро станет слишком медленным, чтобы быть полезным.


Вам ничего не хватает. gulp.watch не работает с новыми или удаленными файлами. Это простое решение, предназначенное для простых проектов.

Чтобы получить просмотр файлов, которые могут искать новые файлы, используйте плагин 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>> );
});

Лично я рекомендую первый вариант. Это позволяет значительно быстрее обрабатывать файлы. Он отлично работает во время разработки с помощью функции "загрузка", если вы не объединяете файлы.

Вы можете обернуть свои потоки либо с помощью моей lazypipe библиотеки, либо просто используя функцию и stream-combiner:

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

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

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

ОБНОВЛЕНИЕ 15 октября 2014 г.

Как указано @pkyeck ниже, очевидно, что релиз 1.0 gulp-watch слегка изменил формат, поэтому приведенные выше примеры должны быть:

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

и

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

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

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

Ответ 2

Оба gulp.watch() и require('gulp-watch')() будут запускаться для новых/удаленных файлов, но если вы не используете абсолютные каталоги. В моих тестах я не использовал "./" для относительных каталогов BTW.

Оба не будут запускаться, если удалены целые каталоги.

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

Ответ 3

Если src - абсолютный путь (начиная с /), ваш код не будет обнаруживать новые или удаленные файлы. Однако есть еще способ:

Вместо:

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

записи:

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

и он будет работать!

Ответ 4

В глобусах должен быть указан отдельный базовый каталог, и это базовое местоположение не должно указываться в самом глопе.

Если у вас lib/*.js, он будет отображаться в текущем рабочем каталоге process.cwd()

Gulp использует Gaze для просмотра файлов, а в Gulp API doc мы видим, что мы можем передавать специальные параметры Gaze на часы функция: gulp.watch(glob[, opts], tasks)

Теперь в Gaze doc мы можем найти, что текущий рабочий каталог (базовый каталог glob) является опцией cwd.

Что приводит нас к ответу alexk: gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);

Ответ 5

Я знаю, что это старый вопрос, но я подумал, что брошу решение, которое я придумал. Ни один из плагинов gulp, которые я нашел, не уведомит меня о новых или переименованных файлах. Таким образом, я закончил обматывание монокласса в удобной функции.

Вот пример использования этой функции:

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 также является удобной функцией, которую я сделал.

И вот фактический модуль часов.

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

Довольно просто, а? Все это можно найти в моем стартовом комплекте gulp: https://github.com/chrisdavies/gulp_starter_kit

Ответ 6

Важно отметить, что он выглядит как gulp.watch только сообщает об изменениях и удаленных файлах в Windows, но при прослушивании новых и удаленных файлов по умолчанию в OSX:

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