为什么新添加的文件不能触发我的gulp-watch任务?

时间:2014-06-19 00:04:09

标签: gulp gulp-imagemin imagemin gulp-watch

我有一个gulp任务,它使用gulp-imagemin来压缩图像。当我将新文件添加到此目录时,我也希望此任务也可以压缩它们。我读到gulp.watch doesn't trigger on new files并且我应该尝试gulp-watch所以我这样使用它;

gulp.task('images', function() {
  watch({glob: './source/images/*'}, function (files) {
    return files
      .pipe(plumber())
      .pipe(imagemin({
        progressive: true,
        interlaced: true
      }))
      .pipe(gulp.dest('./www'));
  });
});

这与第一次运行时的gulp.watch相同,但是当我向目录添加新图像时没有任何反应。但是,如果我覆盖现有文件,它会再次运行任务,因此它的行为会有所不同。

关于gulp-watch的文档称之为" Batch Mode"并说我也可以在每个文件的基础上运行任务,所以我也尝试过这种方式;

gulp.task('images', function() {
  gulp.src('./source/images/*')
    .pipe(watch())
    .pipe(plumber())
    .pipe(imagemin({
      progressive: true,
      interlaced: true
    }))
    .pipe(gulp.dest('./www'));
});

但没有改变。为什么不将文件添加到触发任务的图像目录中?

2 个答案:

答案 0 :(得分:18)

{cwd:'./'}中添加额外参数gulp.watch对我有用:

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

2件事让这个工作:

1 避免文件/文件夹模式中的./

2 确保./的值cwd

祝你好运。

参考: - https://stackoverflow.com/a/34346524/4742733

答案 1 :(得分:8)

这类问题最有可能被重定向到gaze包及其内部流程,这会在您的操作系统上运行复杂的观察程序。在这种情况下,您应该将images/**/*传递给glob选项,因此注视将会在images目录中观看所有(包括新的)文件:

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

gulp.task('default', function() {
    watch({glob: 'images/**/*'}, function (files) {
      files.pipe(imagemin({
        progressive: true,
        interlaced: true
      }))
      .pipe(gulp.dest('./www'));
    });
});

但是当你有空图像目录时,这个填充不能解决问题。如果你想看它们,把['images', 'images/**/*']传递给glob,它会看最初为空的目录。

P.S。在这种情况下你也不需要gulp-plumber,因为watch会重新运行,每次都使用imagemin,即使imagemin弹出错误。