大貓共和國

Meow

RichRC: 在Rails3 Console中輕鬆使用hirb及wirble的懶人包

開發rails應用時,或多或少會需要在console下進行一些操作。但內建的console其實功能有限,於是就有人寫了一些gems來擴充的irb功能。如hirb可以將資料表格化,而wirble提供了著色、自動完成等功能。

在rails 2中,要使用這些gems提供的擴充功能,只要簡單地在irb下載入gems就可以了。但rails 3使用了bundler管理gems,必需在Gemfile中先加入要使用的gems才可以使用。但修改Gemfile會造成一些問題:這些gems的設定該commit回版本控制系統嗎?我認為不應該,每位開發者可能有自己的偏好設定。另外,使用者可能是clone其他開發源碼的專案,而無法commit東西回去。然而,當有其他人修改Gemfile時,可能會造成conflict需要處理。

對於這個問題,感謝xdite的文章「在 Rails3 上使用漂亮的 console」,指出了可以在bundler.setup執行前搶先載入額外的gems,避過修改Gemfile的問題。文中的做法每要在一個rails app中執行console時,需要修改development.rb, boot.rb, console/rails其中兩個檔案,還是要費些工夫。對於常常clone project下來survey的人來說,這點可能尤其麻煩。

有沒有可能避過這些修改檔案的問題呢?「懶惰的工程師需要勤奮的發明工具」,為了懶得每次修改檔案,我動手寫了一個客製化Rails 3 console的工具:RichRC

安裝

在shell下輸入:

$ gem install richrc hirb wirble

P.S. 雖然RichRC預設載入hirb及wirble,但RichRC其實不相依於hirb及wirble這兩個gems。請參看「客製化」一節。

執行

$ cd railsapp
$ richrc

就這樣,不用修改任何檔案,只要將rails console的指令改為richrc即可。richrc預設會執行下列動作:

  • 載入並啟動wirble
  • 載入並啟動hirb
  • 設定ActiveRecord的log顯示於console中

不用修改任何檔案,三個願望一次滿足。

客製化

雖然本文的標題為「RichRC: 在Rails3中輕鬆使用hirb及wirble的懶人包」,但RichRC其實可以任意客製化Rails 3 console載入時額外運行的程式。

RichRC的原理,其實是在「bundler.setup執行前」及「application載入後」執行特定的程式碼。RichRC會讀取一個設定檔,再依設定檔中的邏輯執行初始化的動作。RichRC啟動時,會試圖依下列順序載入設定檔:

  1. 當前目錄下的.richrc
  2. 使用者家目錄下的.richrc
  3. gem中的預設設定

目前gem中的預設設定就如上一節所述:載入hirb及wirble,並設定ActiveRecord的logger。要執行客製化,可以在在console下執行:

$ richrc customize

即可將預設的設定檔複置到./.richrc。接下來就可以修改並加入您想要的gems及設定,前文中有提到,RichRC並不相依於hirb及wirble,如果你不想要這些gems的話,可以將它們拿掉。以下是預設的.richrc:

before(:setup_bundler) do
  # You can load extra gems here.
  require 'irb'

  begin
    gem 'wirble'
    require 'wirble'
    Wirble.init
    Wirble.colorize
  rescue LoadError
    puts "Failed to load wirble"
  end

  begin
    gem 'hirb'
    require 'hirb'
    Hirb.enable
  rescue LoadError
    puts "Failed to load hirb"
  end
end

after(:load_application) do
  ActiveRecord::Base.logger = Logger.new(STDOUT)
end

注意:只有在before(:setup_bundler)中,才可以載入額外的gems。另外,在after(:load_application)後,rails的環境才被載入完成,才可以去設定ActiveRecord的logger(您亦可在此對rails其他元件做設定)。

備註

注意:在.richrc引入與Gemfile中的gems(及他們所相依的gems)衝突的話,可能會造成問題。

RichRC以MIT License開放源碼,源碼位於github,有問題歡迎回報。

Comments