2011-10-18 54 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