ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

Rails 3 でサーバの再起動なしにライブラリを開発する

行き当たりばったりで開発してきたアプリケーションも近頃ではだいぶ煮詰まってきて、モジュール化しないわけにはいかなくなってきた。そこで、再利用可能な部品については積極的にモジュール化し、libディレクトリに放り込んでいく方針にした。

その方針は賢明な判断であると考えているのだが、一つ大きな問題が…

libディレクトリの下のファイルって、サーバが起動するときにだけ読み込まれ、その後ソースコードを変更しても(サーバの再起動がない限りは)実行結果に反映されないのだよね。モジュールの完成度が十分に高く、修正機会が少なければ問題はない(これまではそうだった)のだけれど、これからはそうもいくまい。

コントローラやモデルのように編集結果が即座に反映してくれれば良いのだけどなぁ。このままでは小さいバグを作り込むたびに、サーバの再起動を要求されて開発意欲が激萎えしてしまうよ。

この問題、実はかれこれ1年以上前から悩んでいて、その度にGoogle先生に問い合わせているのだが、紹介されている方法ではうまくいかなくて何度も挫折してきたのだよね。

今回こそ何とか解決してやるぞ!と決意してねばり腰で挑みました。参考にしたのはここ
environments/development.rbでexplicitly_unloadable_constantsを使う形。具体的には、こんな感じ。

ActiveSupport::Dependencies.autoload_paths << File::join( Rails.root, 'lib')
ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Editor'

これでlibディレクトリにあるファイルを自動で再読み込みしてくれるようになる。

そこでさらにlib/editorに次のように書いて、希望のモジュールを読み込む。

module Editor
  require_dependency "editor/editor"
  require_dependency "editor/elements"
  require_dependency "editor/tsort"
  require_dependency "editor/zsort"
end

これでモジュールEditorは、サーバの再起動なしにソースコードの変更を反映してくれるようになる。

ちなみに、試してみて、うまくいかなかったやり方はこちら。こちらの環境ではautoload_pathsが期待通りに動いてくれていない感じ。

注意事項としてライブラリの再読み込みをやりすぎると嫌な現象を引き起こす恐れがあるらしい。最読み込みが必要なモジュールとそうでないものがあるので、変にハマらないように、必要最低限のモジュールだけを対象にしたほうが良いみたいね。そういう意味で、この設定は開発環境だけで有効になるように書いてあるの。