【问题标题】:Ruby: Rails: MRI and JRubyRuby:Rails:MRI 和 JRuby
【发布时间】:2011-12-10 10:55:23
【问题描述】:

我已将 Ubuntu 11.04 上的 Rails 3.0.10/MRI 应用程序移植到 Ubuntu 11.04 上的 JRuby 1.6.4。我的目标是到达一个地方,我只需执行以下操作即可在 JRuby 下运行应用程序。

railsapp1> rbenv local jruby-1.6.4
railsapp1> rails server

为了让应用在 MRI 下运行,

railsapp1> rbenv local 1.9.2-p290
railsapp1> rails server

这个问题的第一部分是解决宝石。为了使这个过程在不更改代码的情况下工作,我在 Rails Gemfile 中做了以下操作

platforms :mri do
    gem 'mysql2', '~>0.2.11'
end
platforms :jruby do
    gem 'jruby-openssl'
    gem 'activerecord-jdbcmysql-adapter'
end

这些 gem 语句是使用蛮力方法获得的,方法是使用 MRI/JRuby 和 SQLite/MySQL 的不同组合创建虚拟 rails 应用程序,然后从生成的 Gemfile 中为每个组合获取 gem 语句。

但这并没有完全做到这一点。我的 config/database.yml 文件如下所示:

development:
    adapter: mysql2
    database: doodad
    username: doodad
    password: doodad
    host: localhost

此 config/database.yml 文件仅适用于 MRI 版本。对于 JRuby 版本,config/database.yml 文件如下所示:

development:
    adapter: mysql
    database: doodad
    username: doodad
    password: doodad
    host: localhost

即文件之间的唯一区别是数据库适配器的名称(mysql vs mysql2)。有没有办法告诉 database.yml 文件或系统初始化程序根据 Ruby 环境是 MRI 还是 JRuby 来选择适配器?

【问题讨论】:

    标签: mysql ruby-on-rails ruby jruby


    【解决方案1】:

    您可以在 database.yml 文件中使用 ERB:

    development:
      adapter: <%= defined?(JRUBY_VERSION) ? "mysql" : "mysql2" %>
      ...
    

    【讨论】:

    • 谢谢!我最终选择了适配器:
    【解决方案2】:

    如果您需要做的只是旋转您的database.yml 文件,那么您已经做得很好了。我通常避免将其签入存储库,因为不同的开发人员有不同的配置,而是只提供一个示例文件。

    同样,在部署方面,服务器有一个在部署之间共享的持久配置文件。这使您可以微调设置,而无需更改您的存储库以适应一台服务器上的奇怪边缘情况。

    如果您仍然对此感到困扰,您可以围绕 JRuby mysql gem 进行包装,将其注册为 mysql2 以进行配置,但这可能是一个危险的游戏基本上在于您的配置,误导可能想要诊断他们遇到的问题的人。这种意义上的人包括忘记了这个黑客的“未来的你”。

    更安全的选择是使用两个不同但相似的开发环境。你可以随意称呼他们:

    development_common: &development_common
      database: doodad
      username: doodad
      password: doodad
      host: localhost
    
    development_jruby:
      <<: *development_common
      adapter: mysql
    
    development_ruby:
      <<: *development_common
      adapter: mysql2
    

    根据需要将本地环境设置为其中之一并不难,或者如果在两个世界中进行集成测试,则根据需要通过设置RAILS_ENV 在两者之间切换。

    【讨论】:

    • 然后我将我的服务器作为“rails server -e development_jruby”还是“rails server -e development_ruby”运行?
    • 这是一种方法。还有RAILS_ENV=development_jruby rails server 选项,这是大多数shell 临时设置环境变量的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多