Are ruby command line switches -rubygems & -r incompatible?
Question
I recently converted a ruby library to a gem, which seemed to break the command line usability
Worked fine as a library
$ ruby -r foobar -e 'p FooBar.question' # => "answer"
And as a gem, irb knows how to require a gem from command-line switches
$ irb -rubygems -r foobar
irb(main):001:0> FooBar.question # => "answer"
But the same fails for ruby itself:
$ ruby -rubygems -r foobar -e 'p FooBar.question'
ruby: no such file to load -- foobar (LoadError)
must I now do this, which seems ugly:
ruby -rubygems -e 'require "foobar"; p FooBar.question' # => "answer"
Or is there a way to make the 2 switches work?
Note: I know the gem could add a bin/program for every useful method but I don't like to pollute the command line namespace unnecessarily
Solution
-rubygems is actually the same as -r ubygems.
It doesn't mess with your search path, as far as I understand, but I think it doesn't add anything to your -r search path either. I was able to do something like this:
ruby -rubygems -r /usr/lib/ruby/gems/myhelpfulclass-0.0.1/lib/MyHelpfulClass -e "puts MyHelpfulClass"
MyHelpfulClass.rb exists in the lib directory specified above.
That kind of sucks, but it at least demonstrates that you can have multiple -r equire directives.
As a slightly less ugly workaround, you can add additional items to the ruby library search path (colon delimited in *nix, semicolon delimited in windows).
export RUBYLIB=/usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib
ruby -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
If you don't want to mess with the environment variable, you can add something to the load path yourself:
ruby -I /usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib \
-rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
OTHER TIPS
Note: this problem exists for ruby 1.8, but is resolved in ruby 1.9.
On 1.8, if you specify both libs via -r
, ruby will try to load each library without paying attention to changes in the $LOAD_PATH
. But rubygems does change $LOAD_PATH
so the gems can be found.
The reason it works with irb
is that irb
does pay attention to $LOAD_PATH
changes.
Unfortunately, the best workaround I've found is to use the more verbose form:
ruby -rubygems -e 'require "foobar"; p FooBar.question'
The pain doesn't increase linearly with the number of libs though, if you use an iterator:
ruby -rubygems -e '%w(rake rspec).each{|r| require r }'