没有触发新的或删除的文件?

下面的 Gulpjs 任务在编辑 globb 匹配中的文件时可以正常工作:

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

但是对于新的或者删除的文件它不起作用(它不会被触发)。我是不是遗漏了什么?

编辑 : 即使使用咕哝-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。

72359 次浏览

编辑: 显然 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>> );
});

就我个人而言,我推荐第一种选择。这使得每个文件的处理速度快得多。在 liverload 的开发过程中,只要不连接任何文件,它就能很好地工作。

您可以使用 我的 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());

更新 2014年10月15日

正如下面@pkyeck 所指出的,显然 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')()都会触发新的/删除的文件。在我的测试中,我没有使用 "./"的相对目录 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');
//});

我知道这是个老问题了,但我觉得我应该抛弃我想到的解决方案。我找到的 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
});
};

非常简单,不是吗? 所有的东西都可以在我的饮食启动工具箱里找到: https://github.com/chrisdavies/gulp_starter_kit

如果 src是绝对路径(从 /开始) ,则代码不会检测到新的或已删除的文件。不过还是有办法的:

而不是:

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

写道:

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

会成功的!

Globs 必须指定一个单独的基目录,而且不能在 Globs 本身中指定该基位置。

如果您有 lib/*.js,它将查看当前工作目录即 process.cwd()

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

现在在 凝视医生中,我们可以发现当前的工作目录(globbasedir)是 cwd选项。

这就引出了 Alexk 的回答: gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);

值得注意的是,它看起来像 Gulp.watch 只报告改变和删除的文件在 Windows 上,但监听新的和删除的文件默认在 OSX:

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

对于新建/重命名/删除的文件,应该使用“ Gulp-watch”,而不应该使用 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));
});
});