【问题标题】:Porting a Ruby/Rails/MRI app to JRuby将 Ruby/Rails/MRI 应用程序移植到 JRuby
【发布时间】:2011-12-09 19:14:26
【问题描述】:

我有一个使用 rbenv、MRI Ruby (1.9.2-p290)、rails 3.0.9 和 SQLite3 的 Ruby/Rails 开发环境。我想将它移植到 JRuby,但是这样做我不需要做任何事情,只需在 Rails 应用程序的根目录中运行“rbenv local jruby-1.6.4”和“rails server”即可使用它与 JRuby,以及“rbenv local 1.9.2-p290”和“rails serer”一起使用它与 MRI Ruby。

我知道 Ruby 和 JRuby 访问 SQLite 的 gem 是不同的,但是如何编写 Gemfile 以便在 Ruby 为 MRI 时拾取与 MRI 相关的 gem,并选择与 JRuby 相关的 gem当 Ruby 是 JRuby 时就起来了?

我还需要将它移植到 MySQL 而不是 SQLite。对于 Ruby 和 JRuby,我需要在这里使用哪些 gem?

为了记录,我使用的是 Ubuntu 11.04、Ruby 1.9.2-p290、JRuby 1.6.4 和 Rails 3.0.9 或 3.0.10。

【问题讨论】:

    标签: mysql ruby sqlite jruby rbenv


    【解决方案1】:

    去年,我们将一个大型 Rails 应用程序移植到 JRuby,工作量惊人。诚然,部分原因与应用程序编写得相当糟糕并且有很多遗留代码有关,但仍然如此。如果您想知道:我们的大多数问题都来自我们使用的宝石,而这些宝石有时取决于例如当时无法与 JRuby 一起正常工作的 FFI。后来我做了一个去鲁比尼乌斯的移植手术,似乎没有那么痛苦,但为了继续做核磁共振而放弃了。

    对于 Gemfile,您可以使用 platform 选项。这是 Bundler 文档中的一个示例:

    gem "weakling",   :platforms => :jruby
    gem "ruby-debug", :platforms => :mri_18
    gem "nokogiri",   :platforms => [:mri_18, :jruby]
    

    它也有块形式:

    platforms :jruby do
      gem "foo"
    end
    

    任何一种形式都很好,因为

    所有涉及组的操作(bundle install、Bundler.setup、 Bundler.require) 的行为与任何不匹配的组完全相同 当前平台被明确排除。

    作为 MySQL 的 gem,我会使用恰当命名的 mysql,JRuby 似乎有一个 jdbc-mysql

    【讨论】:

    • 平台块让我成功了。事实证明,MRI 需要“gem 'sqlite3'”,jruby 需要“gem 'activerecord-jdbcsqlite3-adapter'”。对于 MySQL,MRI 需要“gem 'mysql2'”,而 MRI 需要“gem 'activerecord-jdbcmysql-adapter” '" 对于 jruby。
    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2011-06-21
    • 1970-01-01
    • 2017-05-21
    • 2010-11-29
    相关资源
    最近更新 更多