【问题标题】:GULP: Modify a watched file in place without causing an infinite loopGULP:就地修改监视文件而不会导致无限循环
【发布时间】:2016-06-02 21:47:46
【问题描述】:

我正在尝试使用 gulp 和 jscs 来防止代码异味。我还想使用 watch 以便在进行更改时发生这种情况。我遇到的问题是 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']);
});

【问题讨论】:

    标签: gulp gulp-watch gulp-jscs


    【解决方案1】:

    从 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 任务开始之前停止。因此,在lint 任务期间写入的任何.js 文件都不会触发watcherlint 任务完成后,watcher 再次启动。

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

    【讨论】:

    • 感谢您的浏览!这修复了无限循环。我还想弄清楚如何让它只运行一次任务。
    • @JaredChristensen 既然有人问过basically the same question,我又看了一遍,想出了一个替代解决方案。
    猜你喜欢
    • 2023-04-09
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多