2012-02-10 149 views
4

我一直在追逐我的尾巴在這個問題上幾天,現在比以往任何時候都更遠。我運行的是Rails 3.1,Ruby 1.9,Gem 1.8.15,Linux RHEL 4環境。紅寶石寶石路徑奇怪

簡化的問題是,ruby'require'(和rails)找不到我應用程序需要的所有寶石。而且似乎寶石需求找不到與* .rb不同的寶石名稱。例如,「require'sass'」找到sass.rb.但是「require'therubyracer'」找不到lib中的v8.rb。沒有名爲「therubyracer.rb」的文件。與'therubyrhino'相同的 - 沒有'therubyrhino.rb',但是lib中有'rhino.rb'。

即使這些gem位於我的Gemfile中,Bundle安裝也不會拋出錯誤。

下面是一個例子:

首先,以展示寶石安裝:

>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 

即使「therubyrhino」被安裝,並在道路,捆綁合作,「創業板這」找不到。這個寶石在下面,它可以找到相同的路徑作爲'sass'的

。以下是錯誤:

gem which 'therubyrhino' 
    ERROR: Can't find ruby library file or shared library therubyrhino 

注意,寶石可以找到寶石裏面的rhino.rb文件,因此該路徑必須正常工作。

>gem which rhino 
    /usr/local/lib/ruby/gems/1.9.1/gems/therubyrhino-1.73.1/lib/rhino.rb 

要求並不像rhino.rb雖然:

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) 

它不能找到名字的寶石。

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' 

但正如我所提到的,在我的Gemfile中,'therubyrhino',Bundle安裝工程。

這裏是我的寶石路徑,其中我手動設置爲測試:

>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: 
    - http://rubygems.org/ 

最後,這裏是一個情況下生活是美好的,需要的作品。一切都很好,寶石名稱= LIB名(... /上海社會科學院/ lib中/ sass.rb)的前綴。首先,我們可以看到,青菜寶石安裝:

>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 

寶石可以找到它?是。

>gem which sass 
    /usr/local/lib/ruby/gems/1.9.1/gems/haml-3.1.4/lib/sass.rb 

並確實需要紅寶石的工作嗎?是。

>ruby -rubygems -e 'require "sass"' 
    (no error) 

感謝您的幫助。

回答

2

你必須能夠require之前與gem命令加載的寶石。例如:

$ irb 
1.9.3p0 :001 > gem 'therubyracer' 
=> true 
1.9.3p0 :002 > require 'v8' 
=> true 
2

如果你有therubyracerGemfile,那麼所有你需要在你的應用程序做的是require 'v8'。或者您可以指定的lib它在你Gemfile

gem "therubyracer", :require => 'v8' 

如果使用Bundler.require,上面的線會自動調用require 'v8'

請注意,therubyrhino僅適用於jruby;你不能在C Ruby(MRI)中使用它。