【问题标题】:Rails: How can my app tell if it is running in MRI or JRuby?Rails:我的应用程序如何判断它是在 MRI 还是 JRuby 中运行?
【发布时间】:2011-10-19 14:12:03
【问题描述】:

previous question 中,我询问了如何告诉我的 Gemfile 是采用 JRuby 相关的 gem 还是 MRI 相关的 gem。我得到的答案是在 Gemfile 中执行以下操作:

platforms :jruby do
  gem "activerecord-jdbcsqlite3-adapter"
end

platforms :mri do
  gem "sqlite3"
end

显然,Bundler 中的platforms() 方法知道如何判断我是在运行MRI 还是JRuby。如果我在运行 JRuby 或 MRI,是否有其他方法可以在我的程序中判断?

【问题讨论】:

    标签: ruby-on-rails ruby jruby


    【解决方案1】:

    你能像这样区分这两者吗:

    case (RUBY_ENGINE)
    when 'ruby'
      # ...
    when 'jruby'
      # ...
    end
    

    如果需要,您可以编写一个方法来为您提供 jruby? 方法:

    def jruby?
      RUBY_ENGINE == 'jruby'
    end
    

    【讨论】:

    • 在旧版本上,RUBY_ENGINE 可能未定义,因此您需要与defined? 确认。另外,您可以使用RUBY_PLATFORM,在JRuby 上定义为java
    • 这很方便。对于哪些实现定义了哪些常量,我找不到很好的参考。
    • 谢谢!我最终使用了这段代码(在我的 Rails 应用程序的 database.yml 文件中)
    • 这不能识别 Windows。 RUBY_ENGINE 仍然打印 ruby,而 Bundler 可以区分 Windows 平台和其他平台。 Bundler 是怎么知道的?
    • 使用RUBY_PLATFORM 来确定操作系统的“风格”(不是实际的操作系统品牌和版本,只是Linux、Mac、Windows 类型的操作系统)。但是RUBY_PLATFORM 不会识别 JRuby。
    【解决方案2】:

    使用 Ruby 2.2.3 Config::CONFIG 给我NameError: uninitialized constant Config,但以下工作:

    y RbConfig::CONFIG
    

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 2012-01-07
      • 1970-01-01
      • 2010-09-20
      • 2013-06-15
      • 2017-01-21
      • 2020-09-02
      • 1970-01-01
      • 2020-06-18
      相关资源
      最近更新 更多