Ruby:Rails:MRI和JRuby

时间:2011-10-18 21:07:34

标签: mysql ruby-on-rails ruby jruby

我已经在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

通过使用MRI / JRuby和SQLite / MySQL的不同组合创建虚拟轨道应用程序,然后从生成的Gemfiles中获取每个组合的gem语句,使用暴力方法获取这些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选择适配器?

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

如果你需要做的只是转动你的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来在两者之间进行切换。