将Ruby / Rails / MRI应用程序移植到JRuby

时间:2011-10-18 05:11:47

标签: mysql ruby sqlite jruby rbenv

我有一个使用rbenv,MRI Ruby(1.9.2-p290),rails 3.0.9和SQLite3的Ruby / Rails开发环境。我想把它移植到JRuby,但这样做除了在Rails应用程序的根目录中运行“rbenv local jruby-1.6.4”和“rails server”之外我不需要做任何事情来使用它使用JRuby和“rbenv local 1.9.2-p290”和“rails serer”将它与MRI Ruby一起使用。

我知道访问SQLite的宝石对于Ruby与JRuby是不同的,但是如何编写Gemfile以便在Ruby是MRI时拾取与MRI相关的宝石,并选择与JRuby相关的宝石当Ruby是JRuby时?

我还需要将它移植到MySQL而不是SQLite。我需要在Ruby和JRuby中使用哪些宝石?

为了记录,我使用的是Ubuntu 11.04,Ruby 1.9.2-p290,JRuby 1.6.4和Rails 3.0.9或3.0.10。

1 个答案:

答案 0 :(得分:2)

去年我们向JRuby移植了一个大型Rails应用程序,这是一项令人惊讶的工作量。当然,它的一部分与应用程序写得相当糟糕并且拥有大量遗留代码有关,但仍然如此。如果你想知道:我们的大部分问题都来自我们使用过的宝石,而这些宝石有时会依赖于FFI当时没有与JRuby合作。我稍后做过Rubinius的一个港口似乎不那么痛苦了,但是被放弃了,而不是继续使用MRI。

对于Gemfile,您可以使用platform选项。以下是Bundler文档中的一个示例:

gem "weakling",   :platforms => :jruby
gem "ruby-debug", :platforms => :mri_18
gem "nokogiri",   :platforms => [:mri_18, :jruby]

它还有一个块形式:

platforms :jruby do
  gem "foo"
end

这两种形式都适用,因为

  

涉及组的所有操作(bundle install,Bundler.setup,   Bundler.require)的行为与任何不匹配的组完全相同   目前的平台被明确排除在外。

作为MySQL的宝石,我使用了恰当命名的mysql,JRuby似乎有jdbc-mysql