2011-10-18 80 views
1

我有一個使用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結合使用。將Ruby/Rails/MRI應用移植到JRuby

我知道訪問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。

回答

2

去年我們向JRuby移植了一個大型的Rails應用程序,這是一個令人驚訝的工作量。當然,其中的一部分與應用程序寫得相當糟糕,並且有大量遺留代碼有關,但仍然存在。如果您想知道:我們的大部分問題都來自我們使用的寶石,這些寶石有時候依賴於那時FFI沒有正確地與JRuby合作。到魯比尼烏斯的一個港口,我稍後做了一次,似乎不那麼痛苦,但被放棄了,希望繼續與核磁共振成像。

對於Gemfile,可以使用platform選項。下面是來自捆紮機文檔的例子:

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

它也有一個塊的形式:

platforms :jruby do 
    gem "foo" 
end 

兩種形式效果很好,因爲

所有涉及組操作(包安裝,捆紮機.setup, Bundler.require)的行爲完全相同,就好像任何不匹配 當前平臺的組被明確排除在外。

至於MySQL的一塊寶石,我會用適當命名的mysql,似乎是一個JRuby的jdbc-mysql

+0

平臺塊讓我在那裏的一部分。事實證明,我需要「用於MRI的gem'sqlite3''和用於jruby的'gem'activerecord-jdbcsqlite3-adapter'」。對於MySQL,我需要「gem'mysql2'」用於MRI和「gem」activerecord-jdbcmysql-adapter '「爲jruby。 –