0

私のチームは、Rails と Java の開発者で構成され、JRuby On Rails アプリケーションで共同作業を行っています。Rails のユーザーは、純粋な Ruby インタープリターを使用してフロントエンド アプリケーションを開発することを好みます。Java 担当者はアプリケーションを Tomcat にデプロイし、それを Spring およびコア Java バックエンド サービスと統合します。

Railsフェローが純粋なRubyインタープリターを使用してプロジェクトを開発できるように、プロジェクトを実行しているRubyのバージョンを認識しています。

たとえば、データベース構成を調整します。

module MyWebApp
  class Application < Rails::Application
    def config.database_configuration
      config = super
      if defined? JRUBY_VERSION
        config["development"]["adapter"]="jdbcsqlite3"  
      end
      config
    end
  end
end

Gemfile についても同じです。

gem 'sqlite3'
if defined? JRUBY_VERSION
  gem 'jdbc-sqlite3'
  gem 'activerecord-jdbcsqlite3-adapter' 
end

コア Java サービスのモックも作成します。

class DocumentServiceFactory
  def build
    if defined? JRUBY_VERSION
      spring_context :document_service
    else
      mock :document_service
    end
  end 
end

このソリューションは私たちにとってはうまくいきますが、Rails アプリケーションを Ruby と JRuby の両方に対応させるための一般的なパターン (またはプラグイン、gem、ライブラリなど) があるかどうか知りたいです。

4

1 に答える 1

0

ここで答えるべき3つのことがあります:

  1. しばらくの間、 database.ymlアダプターの構成を変更する必要はありません。adapter: sqlite3またはmysqlなどのままにして、最近のactiverecord-jdbc-adapter(activerecord-jdbcsqlite3-adapterなど)を使用するだけです

  2. これは、 Gemfile でjruby固有の依存関係を処理する正しい方法ではありません。:platformGemfile.lock が一貫しており、Ruby スイッチ間で再生成する必要がないように指定子を使用すると、はるかに優れています。

    gem 'activerecord-jdbcsqlite3-adapter' :platform -> :jruby

  3. サービスのモックについては、おそらく「より良い」方法はありませんが、すべてのルビストがjrubyを使用しているわけではないことに言及しているため、取得するすべてのサービスをモックする必要がないように、REST / Webサービスなどのサービスレイヤーを公開することを検討します導入されたRubyistは、jrubyで実行しても、理解していないJavaの問題に直面することはありません(Spring部分で動作しないため)。

それ以外は、私は MRI での開発/テストと、本番環境での JRuby の使用にかなり満足しています。Ruby 関係者にとって唯一の本当の苦労は、彼らが「真の」threadsafe!コード (jruby スタイル) を書いていることを理解し、新しい gem を追加するときに注意することです。それらが両側で動作することを確認するか、jrubyの代替手段があることを確認します... MRIで正常に動作するgemとの非互換性はほとんどありませんでしたが、JRubyで問題が発生しました(おそらく3つ覚えています)。CI (Jenkins など) が JRuby でテストを実行し、可能な限り早期にテストをキャッチすることをお勧めします。

于 2012-04-21T11:50:31.560 に答える