簡體   English   中英

Ruby:Rails:MRI和JRuby

[英]Ruby: Rails: MRI and JRuby

我已將Ubuntu 11.04上的Rails 3.0.10 / MRI應用程序移植到Ubuntu 11.04上的JRuby 1.6.4。 我的目標是找到一個地方,在該地方必須執行以下操作才能在JRuby下運行該應用程序。

railsapp1> rbenv local jruby-1.6.4
railsapp1> rails server

為了使該應用程序在MRI下工作,

railsapp1> rbenv local 1.9.2-p290
railsapp1> rails server

這個問題的第一部分是解決寶石。 為了使此過程無需更改代碼即可工作,我在Rails Gemfile中做了以下操作

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

通過使用具有MRI / JRuby和SQLite / MySQL不同組合的虛擬rails應用程序,然后通過從生成的Gemfile中為每種組合獲取gem語句,使用蠻力方法獲得了這些gem語句。

但這並不能完全做到。 我的config / database.yml文件如下所示:

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

此config / database.yml文件僅適用於MRI版本。 對於JRuby版本,config / database.yml文件如下所示:

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

即文件之間的唯一區別是數據庫適配器的名稱(mysql vs mysql2)。 有沒有一種方法可以根據Ruby環境是MRI還是JRuby來告訴database.yml文件或系統初始化程序選擇適配器?

您可以在database.yml文件中使用ERB:

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

如果您要做的只是旋轉database.yml文件,那么它就很好了。 由於不同的開發人員具有不同的配置,因此我通常避免將其檢入到存儲庫中,而是僅提供示例文件。

同樣,在部署時,服務器具有一個持久的配置文件,在部署之間共享。 這樣一來,您就可以微調設置,而不必更改回購協議,而只是為了適應一台服務器上的奇怪情況。

如果仍然對此感到不安,則可以圍繞JRuby mysql gem進行包裝,將其注冊為mysql2以進行配置,但這可能是一個危險的游戲,因為您基本上躺在配置中,產生誤導可能想診斷他們遇到的問題的人。 從這個意義上講,人們包括忘記了這種黑客的“未來您”。

一個更安全的選擇是擁有兩個不同但相似的開發環境。 您可以隨便叫他們:

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設置為兩者來切換兩者之間的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM