Gulps gulp.watch没有触发新的或删除的文件?

在glob匹配中编辑文件时,以下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的值)开头的Globs似乎不能正常工作。

编辑:显然gulp.watch现在可以使用新的或删除的文件。 这个问题没有被问到。

我的答案的其余部分仍然是: gulp-watch通常是一个更好的解决scheme,因为它允许您只对已修改的文件执行特定的操作,而gulp.watch只允许您运行完整的任务。 对于一个合理规模的项目来说,这很快就会变得太慢而无法使用。


你不会错过任何东西。 gulp.watch不适用于新的或已删除的文件。 这是一个为简单项目devise的简单解决scheme。

要获取可以查找新文件的文件,请使用function更强大的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>> ); }); 

我个人build议第一个选项。 这允许更快,每个文件的进程。 只要您没有连接任何文件,它在使用livereload进行开发的过程中效果很好。

你可以使用我的lazypipe库来封装你的stream,或者简单地使用一个函数和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()); 

更新 2014年10月15日

正如下面的@pkyeck所指出的,显然gulp gulp-watch的1.0版本稍微改变了这个格式,所以上面的例子应该是:

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

如果使用绝对目录, gulp.watch()require('gulp-watch')() gulp.watch() require('gulp-watch')()会触发新的/删除的文件。 在我的testing中,我没有使用"./"作为相对目录。

如果整个目录都被删除,两者都不会触发。

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

如果src是绝对path(以/开头),则代码不会检测新的或已删除的文件。 不过还有一个办法:

代替:

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

写:

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

它会工作!

Glob必须指定一个单独的基本目录,并且不能在glob中指定基本位置。

如果你有lib/*.js ,它会在当前工作目录( process.cwd()

Gulp使用Gaze来观察文件,并在Gulp API文档中看到我们可以将Gaze特定的选项传递给watch函数: gulp.watch(glob[, opts], tasks)

现在在Gaze doc中,我们可以发现当前工作目录(glob base dir)是cwd选项。

这导致我们alexk的回答: gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);

我知道这是一个较老的问题,但我想我会抛出我提出的解决scheme。 我发现的一大堆插件都没有通知我新的或重命名的文件。 所以我最终把单片眼镜包装在一个便利的function中。

这是一个如何使用这个函数的例子:

 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也是我所做的一个便利function。

这里是实际的手表模块。

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

很简单,呃? 整个事情可以在我的大厨启动工具包find: https : //github.com/chrisdavies/gulp_starter_kit

请注意,它看起来像gulp.watch只报告在Windows上更改和删除的文件,但在OSX上默认侦听新的和删除的文件:

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