我有一个使用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。
答案 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
。