2011-10-18 21 views
2

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

railsapp1> rbenv local jruby-1.6.4 
railsapp1> rails server 

并得到应用MRI下工作,

railsapp1> rbenv local 1.9.2-p290 
railsapp1> rails server 

这个问题的第一部分是要解决的宝石。为了使无需更改代码这个过程中我所做的作品在滑轨的Gemfile

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

那些宝石语句下面通过创建与MRI/JRuby和SQLite的不同组合的虚拟Rails应用/ MySQL的使用蛮力法得到然后从生成的Gemfiles中为每个组合获取gem语句。

虽然这并不完全。我的config/database.yml文件如下所示:

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

此config/database.yml文件仅适用于MRI版本。对于JRuby的版本,在配置/ database.yml文件看起来是这样的:

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

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

回答

7

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

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

谢谢!我最终使用了适配器:<%= RUBY_ENGINE ==“jruby”? “mysql”:“mysql2”%> –

0

如果您只需要旋转database.yml文件,就会非常好。我通常避免检查到存储库,因为不同的开发人员有不同的配置,而只提供一个示例文件。

同样,当涉及到部署时,服务器具有在部署之间共享的持久配置文件。这使您可以微调设置,而无需更改您的repo只是为了适应一台服务器上奇怪的边缘情况。

如果您仍然为此感到困扰,您可以围绕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,就好像在做集成测试中需要在两者之间进行翻转两个世界。

+1

我会再运行我的服务器作为“轨道服务器-e development_jruby”或“轨服务器-e development_ruby”? –

+0

这是一种方法。还有'RAILS_ENV = development_jruby rails server'的选项,这是大多数shell如何临时设置环境变量。 – tadman