エディタ保存したらブラウザリロードするsinatra/auto-reloadを作った
エディタを保存したらブラウザを自動リロードするsinatraプラグインを作った。
これでサブモニタにchromeとJavaScriptコンソール置いておくと幸せになれる。
ソースはgithubに。
Google ChromeもしくはFirefox+Greasemonkeyで動作する。エディタには依存しない。
sinatraアプリをローカルではなくサーバーで実行していてもリロードできる。
■インストール
sudo gem install sinatra-auto-reloadrubygems.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としてインストールできる。
スクリーンショット
ホスト名ごとに違うuserscriptとしてインストールされるので、調べ物して同じブラウザで他のページを開いても大丈夫
■監視しないファイルを定義
sinatraアプリ内でauto_reload_ignoresという関数を定義しておく
def auto_reload_ignores配列内に正規表現で書いたファイルは、更新されてもリロードしない。logとかpidに反応しても困るので。
[/db.*/, /config.yaml/, /log.*/, /pid.*/]
end
ところでプラグインに変数を渡すのは、こういう方法でいいんですかね?もっとまともなやり方がある気がするんだけど。
■しくみ
sinatra/baseに新しくgetでアクセスできるページを追加し、 http://hostname:port/sinatra_auto_reload にファイルの最終更新日時が出るようにした。
これをuserscriptからsetIntervalで監視して、更新があればリロードする。
■参考
JavaScript部分はこれを参考にした
最速インターフェース研究会 :: Firefoxでの開発を高速化する自動リロードスクリプト
■オススメ
sinatra-reloader か shotgun と一緒に使うのをおすすめします
sinatraはサーバーを再起動しないとrubyのコードの変更を読み込んでくれないんだけど、こいつらを使うと毎回読み込み直してくれるようになる。
■今後
よく考えたらSub URIで動かしている場合に動かなそうだ。あとで修正する。