【问题标题】:Ruby Gems Path Weirdness红宝石宝石路径怪异
【发布时间】:2012-03-02 13:52:18
【问题描述】:

我已经在这个问题上追了几天,而且它比以往任何时候都更远。我正在运行 Rails 3.1、Ruby 1.9、Gem 1.8.15、Linux RHEL 4 环境。

简化的问题是 ruby​​ 'require'(和 rails)无法找到我的应用程序需要的所有 gem。似乎 gem 需要找不到与 *.rb 不同的 gem 名称。例如,“require 'sass'”定位 sass.rb。但是“需要'therubyracer'”无法在库中找到v8.rb。没有名为“therubyracer.rb”的文件。相同的 使用“therubyrhino” - 没有“therubyrhino.rb”,但库中有一个“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

Require 不喜欢 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 install 可以工作。

这是我的 gem 路径,我正在手动设置它以进行测试:

>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 名称的前缀 = lib 名称 (.../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 能找到吗?是的。

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

ruby 'require' 有效吗?是的。

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

感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails ruby rubygems gem


    【解决方案1】:

    如果您的Gemfile 中有therubyracer,那么您只需在应用程序中执行require 'v8'。或者您可以在 Gemfile 中指定它的库:

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

    如果你使用Bundler.require,上面的行会自动调用require 'v8'

    请注意,therubyrhino 仅适用于 jruby;您不能将它与 C Ruby (MRI) 一起使用。

    【讨论】:

      【解决方案2】:

      您必须先使用gem 命令加载gem,然后才能使用require。例如:

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

      【讨论】:

        猜你喜欢
        • 2014-04-11
        • 2019-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多