Tech Sketch Bucket of Technical Chips by TIS Inc.

Guardでファイル変更を監視して作業を自動化する

Pocket

CUIで開発しているときにエディタでファイルを編集し、shellで何かを操作するというようなことってよくありますよね。
たとえば、ソースコードを編集したあと、コマンドでコンパイルしたりテストを実行したりなど。そういう単純かつ単調な繰り返しなんかは、リズムが悪くなりますし面倒ですよね。そういうときはGuardを使って自動化しましょう。


Guardって?

Guardは簡単にファイルシステムの変更イベントを扱えるツールです。 https://github.com/guard/guard
Guardには160以上のプラグインがあり、Guardで監視しているファイルの変更が発生した時に、shellなどのコマンドを実行できます。(https://rubygems.org/search?query=guard-)
ということで、今回は汎用性の高いshellを実行するプラグインguard-shellを使う方法を簡単にまとめておきます。

【動作環境】

Guardを動かすにはRubyが必要です。以下の環境で動作が確認出来ているようです。

  • Ruby 1.8.7, 1.9.2, 1.9.3
  • REE
  • JRuby latest version
  • Rubinius latest version

【使い方】

1. Gemfileを用意し、以下の内容を追加します。(gem installでのインストールでも問題ありません)

2. インストールします

3. Guardfileを作ります。

4.Guardを起動します。

以降で詳しく説明しますが、ひとまずこれだけでファイルシステムの変更を監視できるようになります。

【説明】

guard initを実行すると以下の内容でGuardfileが作られます。

この生成されたGuardfileはrubyで評価されます。
Guardfile内はDSLで、guardメソッドはブロックの中でwatchメソッドで監視指定しているファイルに変更があったときに、guard-shellにwatchメソッドの評価値を渡します。guardメソッドの第1引数の'shell'がguard-shellの指定になります。

watchメソッドでは、引数に監視したいファイル名やファイルパスを文字列や正規表現で指定します。
今回の例のようにwatchにブロックを指定することもでき、ブロック引数には、変更があったファイルのファイル名とマッチした文字列といった情報が配列で入ってきます。

つまり、サンプルの内容は拡張子が.txtのファイルが変更されたときに、そのファイルの内容をtailコマンドで表示するという内容になっています。

試してみる

ということで、試してみましょう。
Guardfileと同じディレクトリにtarget.txtというファイルを作り文字を入力して、保存します。

Guardを起動しているターミナル見ると、tailコマンドで『guardに監視されている!!』が表示されていると思います。
簡単ですね!

【応用例】CUIでFlashのちょっとしたツールを作る

最近、ActionScriptでちょっとしたツールを作ることがあったのですが、編集するたびにコンパイルしてswfを作成するのが面倒だったので自動化しました。

開発環境へはflexとactionscript.vimをインストールして、以下のようなGuardfileを用意します。

これだけで準備はOK。

あとはGuardを起動した状態で、ActionScriptファイルを編集し、
guard01.png
保存すると、
guard02.png
ちゃんとコンパイルしてくれます。

おわりに

今回の利用例以外にも、Node.jsでアプリを開発するときに、mochaを自動で実行するために使ったり、Ruby on Railsで開発するときに、guard-rspec、guard-sporkプラグインでrspecを自動実行させたりと、テストの自動実行に使うのもお勧めです。

GuardにはGlowl連携する機能などもあるので、色々試してみてはいかがでしょうか。

エンジニア採用中!私たちと一緒に働いてみませんか?