GULP:修改一个监视文件,而不会导致无限循环

时间:2016-06-02 21:47:46

标签: gulp gulp-watch gulp-jscs

我试图使用gulp和jscs来防止代码味道。我也想使用手表,以便在进行任何更改时都会发生这种情况。我遇到的问题是jscs是修改正在观看的源文件。这导致gulp进入无限循环的jscs修改文件,然后观察看到变化并一次又一次地关闭jscs ......

const gulp = require('gulp');

gulp.task('lint', function() {
    return gulp.src('/src/**/*.js')
        .pipe(jscs({
            fix: true
        }))
        .pipe(jscs.reporter())
        .pipe(gulp.dest('/src'));
});

gulp.task('watch', function() {
    gulp.watch('/src/**/*.js', ['lint']);
});

1 个答案:

答案 0 :(得分:6)

从gulp任务覆盖源文件通常是个坏主意。任何打开这些文件的编辑器/ IDE可能会也可能不会正常处理这些文件。将文件写入单独的dist文件夹通常会更好。

这里说的是两种可能的解决方案:

解决方案1 ​​

您需要停止gulp-jscs插件再次运行并再次写入文件,从而防止您遇到无限循环。要实现这一点,您只需将gulp-cached添加到lint任务中:

var cache = require('gulp-cached');

gulp.task('lint', function() {
  return gulp.src('/src/**/*.js')
    .pipe(cache('lint'))
    .pipe(jscs({
        fix: true
    }))
    .pipe(cache('lint'))
    .pipe(jscs.reporter())
    .pipe(gulp.dest('/src'));
});

第一个cache()确保只传递自上次调用lint以来已更改的磁盘上的文件。第二个cache()确保只有jscs()实际修复过的文件才会首先写入磁盘。

此解决方案的缺点是lint任务仍在执行两次。这不是什么大问题,因为在第二次运行期间文件实际上并没有被linted。 gulp-cache可以防止这种情况发生。但是如果你绝对想确保lint仅在另一种方式下运行一次。

解决方案2

首先,您应该使用gulp-watch plugin而不是内置gulp.watch()(因为它使用了高级chokidar库而不是gaze)。

然后你可以自己编写一个简单的pausableWatch()函数并在watch任务中使用它:

var watch = require('gulp-watch');

function pausableWatch(watchedFiles, tasks) {
  var watcher = watch(watchedFiles, function() {
    watcher.close();
    gulp.start(tasks, function() {
      pausableWatch(watchedFiles, tasks);
    });
  });
}

gulp.task('watch', function() {
  pausableWatch('/src/**/*.js', ['lint']);
});

在上面,watcherlint任务开始之前停止。因此,在.js任务期间写入的任何lint文件都不会触发watcherlint任务完成后,watcher将再次启动。

此解决方案的缺点是,如果在执行.js任务时保存lint文件,watcher将无法获取更改(因为它已被删除)停止)。在.js任务完成后(再次启动lint时),您必须保存watcher文件。