javascript - Gulps gulp.watch 不会为新文件或已删除文件触发?

标签 javascript node.js gulp

在全局匹配中编辑文件时,以下 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');
    });
});

编辑:已解决,它是 this issue .以 ./ 开头的 Glob(即 src 的值)似乎无法在 ATM 上工作。

最佳答案

编辑: 显然 gulp.watch 现在可以处理新文件或已删除文件。问问题时没有。

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


你没有错过任何东西。 gulp.watch 不适用于新文件或已删除文件。这是一个为简单项目设计的简单解决方案。

要获得可以查找新文件的文件监视,请使用 the gulp-watch plugin , 更强大。用法如下所示:

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 的开发过程中运行良好。

您可以使用 my lazypipe library 结束您的直播。 ,或者简单地使用一个函数和 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());

关于javascript - Gulps gulp.watch 不会为新文件或已删除文件触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22391527/

相关文章:

javascript - Electron 打包后不支持 ES6

xml - 尝试从 Node.js 获取信息 SOAP 时出错

linux - 如何安装 Cassandra nodejs

java - 首次运行 jhipster 应用程序时出错

gulp - 在 gulp 中使用 concat() 保持文件夹结构

javascript - 如何将参数从 Flame.js 小部件传递到 ember 函数

javascript - Angular 2.1.0 动态创建子组件

javascript - react 原生 - "Rendered more hooks than during the previous render?"

mongodb - 即时定义 Mongoose Schema

javascript - gulp autoprefixer 编译为 .scss 而不是 .css