从 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']);
});
在上面的watcher 在lint 任务开始之前停止。因此,在lint 任务期间写入的任何.js 文件都不会触发watcher。 lint 任务完成后,watcher 再次启动。
此解决方案的缺点是,如果您在执行lint 任务时保存.js 文件,则watcher 将不会获取更改(因为它已停止)。在lint 任务完成后(当watcher 再次启动时),您必须保存.js 文件。