LoginSignup
6
4

More than 5 years have passed since last update.

Vim が 3回 inotify イベントを飛ばすので Guard がうるさい問題

Posted at

背景

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"]

このあたりを参考に。

トラッカーでは「対応したぜ」って雰囲気になっているのだが、残念ながら現在の 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 が思ったよりもでかいライブラリだったので日和ってしまいました。すみません。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4