Loading Ruby classes - where does Ruby look?
Archive - Originally posted on "The Horse's Mouth" - 2012-02-24 08:13:31 - Graham EllisIf you're loading a Ruby class (or other code) from another source file, use the require function, and give the file name without the .rb on the end of it. Ruby will look in each of the directories listed in $: or $LOAD_PATH in turn, and that list usually includes . (the current directory). See that in irb:
>> puts $:
/Library/Ruby/Site/1.8
/Library/Ruby/Site/1.8/powerpc-darwin11.0
/Library/Ruby/Site/1.8/universal-darwin11.0
/Library/Ruby/Site
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/vendor_ruby/1.8
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/vendor_ruby/1.8/universal-darwin11.0
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr /lib/ruby/vendor_ruby
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/powerpc-darwin11.0
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin11.0
.
=> nil
>>
But, occasionally, you may find a system where . is not included; there are security concerns relating to injection attacks in unfriendly environments which cause this to be a concern. And the effect is an error like this, even if the porridge.rb file is present in your current directory:
>> require "porridge"
LoadError: no such file to load -- porridge
This came up yesterday on a delegate's system, running the Backtrack version of Ubuntu.
Solution? Set the RUBYLIB environment variable, which is an extra colon-separated list of places that require is to look. You should export the variable from your shell, so:
export RUBYLIB=$RUBYLIB:.
(the echoing back of the old value allowing for other modifications of RUBYLIB which you will not want to overwrite).