[英]GULP: Modify a watched file in place without causing an infinite loop
我試圖使用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']);
});
從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
插件而不是內置的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
文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.