我有一个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'));
});
但没有改变。为什么不将文件添加到触发任务的图像目录中?
答案 0 :(得分:18)
在{cwd:'./'}
中添加额外参数gulp.watch
对我有用:
gulp.watch('src/js/**/*.js',{cwd:'./'},['scripts']);
2件事让这个工作:
1 避免文件/文件夹模式中的./
2 确保./
的值cwd
祝你好运。
答案 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弹出错误。