エディタを保存したらブラウザを自動リロードするsinatraプラグインを作った。
これでサブモニタにchromeとJavaScriptコンソール置いておくと幸せになれる。
ソースはgithubに。

Google ChromeもしくはFirefox+Greasemonkeyで動作する。エディタには依存しない。
sinatraアプリをローカルではなくサーバーで実行していてもリロードできる。



■インストール

sudo gem install sinatra-auto-reload
rubygems.orgに置いたので、gemコマンドでインストールできる



■使う
sinatraアプリ内で読み込む
require 'sinatra/auto-reloader' if development?
if development? すると、shotgunか -e development オプションを付けて起動した時だけ有効になる。production環境には影響を与えない。



■ブラウザ拡張をインストール
localhost:4567 でアプリを起動しているとして、
http://localhost:4567/sinatra_auto_reload.user.js にgreasemonkeyスクリプトが生成される。
Firefox 3.5+Greasemonkey、もしくはChrome 5.0のuserscriptとしてインストールできる。


スクリーンショット
sinatra-auto-reload Firefox userscript


ホスト名ごとに違うuserscriptとしてインストールされるので、調べ物して同じブラウザで他のページを開いても大丈夫
sinatra-auto-reload Chrome userscript



■監視しないファイルを定義
sinatraアプリ内でauto_reload_ignoresという関数を定義しておく
def auto_reload_ignores
  [/db.*/, /config.yaml/, /log.*/, /pid.*/]
end
配列内に正規表現で書いたファイルは、更新されてもリロードしない。logとかpidに反応しても困るので。


ところでプラグインに変数を渡すのは、こういう方法でいいんですかね?もっとまともなやり方がある気がするんだけど。



■しくみ
sinatra/baseに新しくgetでアクセスできるページを追加し、 http://hostname:port/sinatra_auto_reload にファイルの最終更新日時が出るようにした。
これをuserscriptからsetIntervalで監視して、更新があればリロードする。



■参考
JavaScript部分はこれを参考にした
最速インターフェース研究会 :: Firefoxでの開発を高速化する自動リロードスクリプト



■オススメ
sinatra-reloader か shotgun と一緒に使うのをおすすめします
sinatraはサーバーを再起動しないとrubyのコードの変更を読み込んでくれないんだけど、こいつらを使うと毎回読み込み直してくれるようになる。


■今後
よく考えたらSub URIで動かしている場合に動かなそうだ。あとで修正する。