Reload a single gem dependency source file
You are inside the Rails console, developing the app and a corresponding framework located in a separate gem.
You have a symlink in your code directory pointing to the gem source tree in $GEM_HOME (or, even better, you are using my bundler trick ;-)). Anyway - your gem source files are reachable via ../gemname/lib/gem_name/ relative to your app.
If you change the gem source, you'd have to reboot the whole Rails console - losing at least 10 seconds for every change.
Not anymore - just use Kernel.load:
>> load '../gemname/lib/gem_name/changed_file.rb'
>> reload!
Why does this work? Because Rails' reload! helper undefines all autoloaded constants, and then reloads your source files - and when your sources are reloaded, any metaprogramming carried out by your gem will be invoked again, re-defining methods and stuff inside your classes.
Danger, Will Robinson
- if you do nasty(tm) things in your gem such as altering the class hierarchy, you'll get
superclass mismatch. - if you don't do metaprogramming in your gem, you can skip the
reload!- as the gem's modules and classes will be updated by the firstloadcall - if you define constants in the source you are re
loading, you'll get warnings - of course.
Bottom Line
Ruby is truly dynamic - I like to think about it as an UNIX system: very seldom it needs to be rebooted: there is always a way to fix things avoiding a cold restart - and learning how to do it is much fun :-).
~vjt