从 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
插件而不是内置的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
因此,在任务期间写入的任何 .js
文件lint
都不会触发watcher
. lint
任务完成后,再次watcher
启动。
此解决方案的缺点是,如果您在执行任务时保存.js
文件,则该更改将不会被(因为它已停止)lint
拾取。watcher
您必须在任务完成.js
后保存文件(再次启动时)。lint
watcher