[英]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.