我已经在这个问题上追了好几天了,现在比以往任何时候都更远了。我正在运行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 install也不会抛出错误。
以下是一个例子:
首先,要演示安装gem:
>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',并且在路径和捆绑工作中,'gem which'也找不到它。
这个宝石与'sass'相同的路径,在下面,它可以找到。这是错误:
gem which 'therubyrhino'
ERROR: Can't find ruby library file or shared library therubyrhino
请注意,gem可以在gem中找到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/
最后,这是一个生活很美好并需要工作的案例。一切都很好,并且gem name = lib name(... / sass / lib / sass.rb)的前缀。首先我们可以看到安装了sass gem:
>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)
感谢您的帮助。
答案 0 :(得分:2)
您必须先使用gem
命令加载gem,然后才能require
。例如:
$ irb
1.9.3p0 :001 > gem 'therubyracer'
=> true
1.9.3p0 :002 > require 'v8'
=> true
答案 1 :(得分:2)
如果therubyracer
中有Gemfile
,那么您在应用中需要做的就是require 'v8'
。或者您可以在Gemfile
中指定它:
gem "therubyracer", :require => 'v8'
如果您使用Bundler.require
,则上述行会自动调用require 'v8'
。
请注意,therubyrhino
仅适用于jruby
;你不能在C Ruby(MRI)中使用它。