我已经将我在Ubuntu11.04上的Rails 3.0.10/MRI应用程序移植到了Ubuntu11.04上的JRuby 1.6.4。我的目标是在JRuby下运行应用程序,只需执行以下操作即可。
railsapp1> rbenv local jruby-1.6.4
railsapp1> rails server为了让这个应用在核磁共振下工作,
railsapp1> rbenv local 1.9.2-p290
railsapp1> rails server这个问题的第一部分是解决gem。为了在不更改代码的情况下使此过程正常工作,我在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版本,配置/数据库.yml文件如下所示:
development:
adapter: mysql
database: doodad
username: doodad
password: doodad
host: localhost也就是说,文件之间唯一的区别是数据库适配器的名称(mysql和mysql2)。有没有办法告诉database.yml文件或系统初始化器根据Ruby环境是MRI还是JRuby来选择适配器?
发布于 2011-10-19 06:30:24
您可以在database.yml文件中使用ERB:
development:
adapter: <%= defined?(JRUBY_VERSION) ? "mysql" : "mysql2" %>
...发布于 2011-10-19 05:18:01
如果你所需要做的就是旋转你的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在两者之间切换。
https://stackoverflow.com/questions/7813748
复制相似问题