I’ve been chasing my tail on this problem for a couple days now and its
further away than ever. I am running a Rails 3.1, Ruby
1.9, Gem 1.8.15, Linux RHEL 4 environment.
The simplified problem is that ruby ‘require’ (and rails) can’t find all
the gems my app needs. And it seems that the gems require can’t find
have a gem name different than the *.rb. For example, “require ‘sass’”
locates sass.rb. But “require ‘therubyracer’” fails to locate the v8.rb
inside the lib. There is no file called ‘therubyracer.rb’. Same with
‘therubyrhino’ -
there is no’therubyrhino.rb’ but there is a ‘rhino.rb’ in the lib.
Bundle install does not throw an error even when these gems are in my
Gemfile.
Here is an example:
First, to demonstrate the gem is installed:
locate ‘rhino.rb’
/usr/local/lib/ruby/gems/1.9.1/gems/therubyrhino-1.73.1/lib/rhino.rb
/usr/local/lib/ruby/gems/1.9.1/gems/gems/therubyrhino-1.73.1/lib/rhino.rb
Even though ‘therubyrhino’ is installed, and in the path, and bundle
worked, ‘gem which’ cannot find it. And this gem is in the
same path as ‘sass’, below, which it can find. Here is the error:
gem which ‘therubyrhino’
ERROR: Can’t find ruby library file or shared library therubyrhino
Note that gem can find the rhino.rb file inside the gem, so the path
must be working.
gem which rhino
/usr/local/lib/ruby/gems/1.9.1/gems/therubyrhino-1.73.1/lib/rhino.rb
Require doesn’t like the rhino.rb though:
ruby -rubygems -e ‘require “rhino”’
/usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in
`
require’: no such file to load – java (LoadError)
And it can’t find the gem by name.
ruby -rubygems -e ‘require “therubyrhino”’
/usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in
require': no such file to load -- therubyrhino (LoadError) from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in
require’
But as I mentioned, whith ‘therubyrhino’ in my Gemfile, Bundle install
works.
Here is my gem path, which I am setting manually to test:
export
GEM_PATH=/usr/local/lib/ruby/gems/1.9.1:/usr/local/lib/ruby/gems/1.9.1/gems:/usr/local/lib/ruby/gems/1.9.1/gems/gem
gem env
…
RubyGems Environment:
- RUBYGEMS VERSION: 1.8.15
- RUBY VERSION: 1.9.2 (2011-07-09 patchlevel 290) [i686-linux]
- INSTALLATION DIRECTORY: /usr/local/lib/ruby/gems/1.9.1
- RUBY EXECUTABLE: /usr/local/bin/ruby
- EXECUTABLE DIRECTORY: /usr/local/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86-linux
- GEM PATHS:
- /usr/local/lib/ruby/gems/1.9.1
- /usr/local/lib/ruby/gems/1.9.1/gems
- /usr/local/lib/ruby/gems/1.9.1/gems/gem
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :benchmark => false
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
And finally, here is a case where life is good and require works. All is
well and the prefix of the gem name = lib name
(…/sass/lib/sass.rb). First we can see that the sass gem is installed:
locate sass.rb
/usr/local/lib/ruby/gems/1.9.1/gems/sass-3.1.14/lib/sass.rb
/usr/local/lib/ruby/gems/1.9.1/gems/haml-3.1.4/vendor/sass/lib/sass.rb
/usr/local/lib/ruby/gems/1.9.1/gems/haml-3.1.4/lib/sass.rb
Can Gem find it? Yes.
gem which sass
/usr/local/lib/ruby/gems/1.9.1/gems/haml-3.1.4/lib/sass.rb
And does ruby ‘require’ work? Yes.
ruby -rubygems -e ‘require “sass”’
(no error)