背景
Guard を利用してファイル変更時のテスト実行を自動化しようとしたのだけれども、vim がファイル変更の際にイベントを3回も飛ばすものだから、hoge.rb
をちょいと更新するとこんな感じに 3回テストが走る。
14:29:42 - DEBUG - Trying to run Guard::Rake#run_on_modifications with [“hoge.rb"]
14:29:43 - DEBUG - Trying to run Guard::Rake#run_on_additions with ["hoge.rb"]
14:29:45 - DEBUG - Trying to run Guard::Rake#run_on_removals with ["hoge.rb"]
このあたりを参考に。
- http://stackoverflow.com/questions/10300835/too-many-inotify-events-while-editing-in-vim
- https://github.com/guard/guard/commit/d78ecb45fb784b08c3823984eb04f5448c5ffc1e
トラッカーでは「対応したぜ」って雰囲気になっているのだが、残念ながら現在の Guard の公式実装ではこのあたりのコードがごっそり手が入っており有効ではない。というか実際の listnerr が Guard 本体から外に出てる気がするし。
そんなわけで、アドホックに対応
3年前に Guard に一度導入された方式で考えます。つまり、inotify の反応するイベントを絞る方式です。
Linux上で使ってる Guard はこいつを参照しているようなので、直接 gem のコードを書き換えてしまうことにします。
:close_wait
で grep してファイルを特定して、linux.rb を開きます。
vi ./vendor/bundle/ruby/1.9.1/gems/listen-2.4.0/lib/listen/adapter/linux.rb
12行目あたりの箇所を、以下のような状態から
EVENTS = [:recursive, :attrib, :create, :delete, :move, :close_write]
このように変更してしまいましょう
EVENTS = [:recursive, :move_self, :close_write]
男らしく属性変更も移動削除も追跡しない仕様に変更だ!
これで、vim でファイル変更しても 3回テストが走ることはなくなった。よかった!
:create
とか :move
を取ってないとファイルの追加削除に弱くなってしまうのでちょっとデリケートだけど、まあ、そのあたりは guard-shell
上で r
とか打って貰うとして。
筋としては、同じファイルから短時間に連続してイベントが発生した場合とか、バッファリングした上で同じ内容のタスク実行はまとめてしまうような修正を Guard 側に行うのがよいんだろうな。Guard が思ったよりもでかいライブラリだったので日和ってしまいました。すみません。