MacやWindowsのテキストエディタ・画像編集ツールを使っていると、ファイルの保存時に書き込みが2度続けて起きる(と判定される)場合があります。例えば、Espresso, Coda, SublimeTextほかを使っていて、ソースコードを保存する際に、タスクランナーのログを見ると2度走っているケースなど。
gulp.jsやGruntといった、Node.js系のタスクランナーでは、ファイル監視にgazeを使っています。このgazeに適切なオプションを渡せば、この問題は解決されます。以下、その説明です。
gulp.js の場合
通常、こんな感じでwatch
していると思いますが、第二引数にgazeのオプションを渡すことができます。 cf. 公式APIドキュメント
var gulp = require("gulp");
gulp.task('watch', function(){
gulp.watch('coffee/*.coffee', ['coffee']);
});
例えば、再実行を10秒間抑制したければ、次のようにオプションを指定します。
var gulp = require("gulp");
gulp.task('watch', function(){
var gaze_opt = {
debounceDelay: 10000 // wait 10 sec after the last run
};
gulp.watch('coffee/*.coffee', gaze_opt, ['coffee']);
});
参考: gazeで設定できるオプション
debounceDelay
以外にも、gaze
に渡せるオプションがあります。
オプション | 型 | 説明 |
---|---|---|
interval | integer |
fs.watchFile に渡すインターバル |
debounceDelay | integer |
同じファイル/イベントの処理が完了した後、再度実行されるまでのディレイ (ミリ秒) |
mode | string |
'auto': デフォルト 'watch': 強制的にネイティブAPIを使う 'poll': 強制的にポーリング |
cwd | string |
ワーキングディレクトリの指定。デフォルトは process.cwd() |
詳しくは、gazeのドキュメントを参照のこと。
Grunt の場合
Gruntは、公式プラグインのgrunt-contrib-watchからgaze
を利用します。
watch: {
scripts: {
files: 'coffee/*.coffee',
tasks: ['coffee'],
options: {
debounceDelay: 10000, // wait 10 sec after the last run
},
},
},
上記の例では、先ほどのgulp.jsの例と同様に10秒間、タスクの再実行を抑制しています。デフォルトは500ミリ秒です。
Gruntの場合も、前項の「gazeで設定できるオプション」を設定できるほか、いくつかの拡張があります。詳しくは、grunt-contrib-watch のドキュメントをどうぞ。