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

最初の部分は、宝石を解決することでした。コードの変更なしで、このプロセスの作品を作るために、私は/ MySQLのMRI/JRubyとSQLiteのの異なる組み合わせを持つダミーレールのアプリを作成することにより、ブルートフォース法を使用して得たRailsのGemfile

platforms :mri do 
    gem 'mysql2', '~>0.2.11' 
end 
platforms :jruby do 
    gem 'jruby-openssl' 
    gem 'activerecord-jdbcmysql-adapter' 
end 

これらの宝石の文に次のように行きました生成されたGemファイルから各組み合わせのgemステートメントを取得します。

これはあまり効果がありません。

development: 
    adapter: mysql2 
    database: doodad 
    username: doodad 
    password: doodad 
    host: localhost 

これのconfig/database.ymlをファイルにのみMRIバージョンのために働く:/ database.ymlをファイルに私の設定は次のようになります。 JRubyのバージョンについては、configが/ database.ymlをファイルには、次のようになります。

development: 
    adapter: mysql 
    database: doodad 
    username: doodad 
    password: doodad 
    host: localhost 

すなわちファイル間の唯一の違いは、データベースアダプタ(mysql2対mysqlの)の名前です。 Ruby環境がMRIかJRubyかに基づいてadapter.ymlファイルまたはシステム初期化子にアダプタを選択するよう指示する方法はありますか?

答えて

7

あなたのdatabase.ymlファイルにERBを使用することができます:「サーバー-e development_jrubyレール」または「サーバが-e development_rubyレール」として

development: 
    adapter: <%= defined?(JRUBY_VERSION) ? "mysql" : "mysql2" %> 
    ... 
+2

ありがとう!私は最終的にアダプターに行った:<%= RUBY_ENGINE == "jruby"? "mysql": "mysql2"%> –

0

あなたが行う必要があるのは、database.ymlファイルを回転させることだけで十分です。私は一般に、異なる開発者が異なる構成を持ち、代わりにサンプルファイルのみを提供するので、リポジトリにチェックインすることは避けてください。

同様に、デプロイメントに関しては、サーバーはデプロイ間で共有される永続的な構成ファイルを持っています。これにより、1つのサーバーで奇妙なエッジケースに対応するだけで、レポを変更せずに設定を微調整することができます。あなたはまだこれに悩まさしている場合

は、設定の目的のためにmysql2として登録JRubyのmysql宝石のラッパーを作ることができるが、それはおそらくあなたが、基本的に横たわっているとしてプレーする危険なゲームですあなたの設定、彼らが抱えている問題を診断したい人を誤解させることがあります。この意味での人々には、このハックを忘れてしまった「将来のあなた」が含まれます。

より安全な代替策は、開発のために2つの異なるが同様の環境を持つことです。あなたが欲しいものは何でもそれらを呼び出すことができます。

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

が、私はその後、私のサーバーを実行しますか? –

+0

これはその方法の1つです。ほとんどのシェルが環境変数を一時的に設定する方法である 'RAILS_ENV = development_jruby rails server'を実行するオプションもあります。 – tadman