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

2022-08-30 02:58:37

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

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

编辑:解决了,这是这个问题。以(这是 的价值)开头的 Globs 似乎无法正常工作 ATM。./src


答案 1

编辑:显然,现在确实可以使用新的或删除的文件。当提出问题时,它没有。gulp.watch

我的答案的其余部分仍然有效:通常是一个更好的解决方案,因为它只允许您对已修改的文件执行特定操作,而只允许您运行完成的任务。对于一个规模合理的项目,这很快就会变得太慢而没有用处。gulp-watchgulp.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>> );
});

就个人而言,我推荐第一种选择。这允许更快的每个文件进程。在使用 livereload 进行开发期间,只要您不连接任何文件,它就非常有效。

您可以使用我的懒管来包装流,或者简单地使用函数和流组合器,如下所示:

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

两者都会触发新的/已删除的文件,但是如果您使用绝对目录,则不会触发。在我的测试中,我没有使用相对目录BTW。gulp.watch()require('gulp-watch')()"./"

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

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