2012-04-12 71 views
0

我的团队由在JRuby On Rails应用程序上一起工作的Rails和Java开发人员组成。 Rails人更喜欢使用纯Ruby解释器来开发前端应用程序。 Java人将应用程序部署到Tomcat,并将其与Spring和核心Java后端服务集成。使JRuby On Rails应用程序适合Rails和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 

此解决方案对我们来说,但我很好奇,如果有任何一般模式(或插件,宝石,图书馆等)制作Rails应用程序兼容Ruby和JRuby?

+0

你可以制作Java和MRI宝石,所以它应该在宝石级别处理。 – Reactormonk 2012-04-12 12:12:50

+0

嗯...我不知道如何在宝石级别更改数据库适配器。但是,将所有MRI/JRuby切换逻辑委托给宝石将是一个优雅的解决方案。我会对这种方法进行一些研究。感谢您的建议。 – 2012-04-12 12:52:53

回答

0

有三样东西在这里回答:

  1. 一直没有必要改变的database.yml适配器配置了一段时间。 只是将它保留为adapter: sqlite3或mysql等,并使用最近的activerecord-jdbc-adapter的ActiveRecord-jdbcsqlite3适配器

  2. 这肯定不是你的Gemfile来处理特定的JRuby依赖的正确方法。如果你使用:platform说明符,那么Gemfile.lock就是一致的,并且不需要在ruby开关之间重新生成,这会更好。 :

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

  3. 的服务模拟有可能不是一个“更好”的方式,但既然你提到你不能所有rubyist使用JRuby的,我会考虑公开服务层例如作为REST/Web服务,这样你就不必模拟每个引入的服务,rubyist也不会遇到他们不明白的java问题(因为它们不适用于spring部分),即使使用jruby运行也是如此。

比其他

,我一直与发展中国家在MRI /测试和生产使用JRuby很高兴,你的红宝石乡亲唯一真正的喧嚣是了解他们写上“真正” threadsafe!代码(JRuby的风格)并且在添加新宝石时要小心,以确保它们在两侧都能工作或者有一个jruby替代品......我很少与在MRI上运行良好的宝石有不兼容性,但在JRuby上有问题(也许我记得有3次)。我当然推荐CI(例如Jenkins)在JRuby上运行你的测试,以尽可能早地捕捉那些测试。