0

我的团队由 Rails 和 Java 开发人员组成,他们一起开发 JRuby On Rails 应用程序。Rails 人更喜欢使用纯 Ruby 解释器来开发前端应用程序。Java 人员将应用程序部署到 Tomcat 并将其与 Spring 和核心 Java 后端服务集成。

我们知道哪个版本的 Ruby 正在执行该项目,以允许 Rails 研究员使用纯 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

这个解决方案对我们有用,但我很好奇是否有任何通用模式(或插件、gem、库等)可以使 Rails 应用程序对 Ruby 和 JRuby 都友好?

4

1 回答 1

0

这里有3件事要回答:

  1. 暂时不需要更改database.yml适配器配置。只需将其保留为adapter: sqlite3mysql 等并使用最近的activerecord-jdbc-adapter例如activerecord-jdbcsqlite3-adapter

  2. 这当然不是在Gemfile中处理 jruby 特定依赖项的正确方法。如果你使用说明符会更好,:platform这样 Gemfile.lock 是一致的,并且不需要在 ruby​​ 开关之间重新生成,例如:

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

  3. 对于服务模拟,可能没有“更好”的方式,但是由于您提到并非所有 ruby​​ist 都使用 jruby,所以我会考虑将服务层公开为 REST/Web 服务,这样您就不必模拟获得的每个服务即使使用 jruby 运行,introduced 和 ruby​​ist 也不会遇到他们不理解的 java 问题(因为它们不适用于 spring 部分)。

除此之外,我对 MRI 上的开发/测试以及在生产中使用 JRuby 感到非常满意,对于您的 ruby​​ 人员来说,唯一真正的忙是了解他们编写“真正的”threadsafe!代码(jruby 风格)并在添加新 gem 时要小心以确保它们在双方都能工作或有一个 jruby 替代品......我几乎没有与在 MRI 上运行良好但在 JRuby 上出现问题的宝石不兼容(我记得可能有 3 个)。我当然推荐 CI(例如 Jenkins)使用 JRuby 运行您的测试,以便尽可能早地捕获这些测试。

于 2012-04-21T11:50:31.560 回答