capistrano_colors
capistrano_colors とは
Capistrano の実行結果を見やすいように色付けします。
例えば、以下のようになります。
インストール
capistrano_colors は RubyGems を使ってインストールできます。
$ gem install capistrano_colors (環境によっては以下のコマンドになるでしょう) $ sudo gem install capistrano_colors $ gem1.8 install capistrano_colors $ gem187 install capistrano_colors
インストールしただけでは、capistrano_colors は有効になります。なりません。(2009/02/20追記)
有効にするには、 ~/.caprc に以下を追記します。
require "capistrano_colors"
私は以下のコマンドで
$ echo 'require "capistrano_colors"' > ~/.caprc (すでに ~/.caprc ファイルが存在する場合は以下。) $ echo 'require "capistrano_colors"' >> ~/.caprc
特定の Capistrano の設定のみ capistrano_colors を有効にしたい場合は、config/deploy.rb に以下を追記します。
require "capistrano_colors"
設定
設定により capistrano_colors による色付けを変更できます。
以下は、capistrano_colors の README.rdoc にあるサンプルの設定にコメントを追加したものです。
require "capistrano_colors" capistrano_color_matchers = [ # "command finished" を含む行を隠す。(文字色として :hide に設定する) { :match => /command finished/, :color => :hide, :prio => 10 }, # "executing command" を含む行の、文字色を青色とし、下線を引く。 { :match => /executing command/, :color => :blue, :prio => 10, :attribute => :underscore }, # "transaction: commit" の行の文字色をマゼンタ色とし、点滅させる。 { :match => /^transaction: commit$/, :color => :magenta, :prio => 10, :attribute => :blink }, # "git" を含む行の文字色を白色とし、反転表示する。 { :match => /git/, :color => :white, :prio => 20, :attribute => :reverse }, ] # 上記の設定を反映する。 colorize( capistrano_color_matchers )
capistrano_colors の裏側
では、capistrano_colors はどのようにして Capistrano の実行結果を色付けしているのか見ていきます。
in lib/capistrano_colors.rb
puts "\n\e[36m == capistrano_colors loaded ==\e[0m\n\n"
require したときに == capistrano_colors loaded == が出力されるのは、なぜかなと思ったら、トップレベルで puts しているようです。つまり、必ず出力されます。
# DEBUG Capistrano::Logger.add_color_matcher({ :match => /executing `.*/, :color => :green, :level => 2, :prio => -10, :prepend => "== Currently " }) Capistrano::Logger.add_color_matcher({ :match => /.*/, :color => :yellow, :level => 2, :prio => -20 }) # INFO Capistrano::Logger.add_color_matcher({ :match => /.*out\] (fatal:|ERROR:).*/, :color => :red, :level => 1, :prio => -10 }) Capistrano::Logger.add_color_matcher({ :match => /Permission denied/, :color => :red, :level => 1, :prio => -20 }) Capistrano::Logger.add_color_matcher({ :match => /sh: .+: command not found/, :color => :magenta, :level => 1, :prio => -30 }) # IMPORTANT Capistrano::Logger.add_color_matcher({ :match => /^err ::/, :color => :red, :level => 0, :prio => -10 }) Capistrano::Logger.add_color_matcher({ :match => /.*/, :color => :blue, :level => 0, :prio => -20 })
デフォルトの条件は次のようなもの。上記をサンプルと同様に記述すると以下のようになります。
capistrano_color_matchers = [ # DEBUG { :match => /executing `.*/, :color => :green, :level => 2, :prio => -10, :prepend => "== Currently " }, { :match => /.*/, :color => :yellow, :level => 2, :prio => -20 } # INFO { :match => /.*out\] (fatal:|ERROR:).*/, :color => :red, :level => 1, :prio => -10 }, { :match => /Permission denied/, :color => :red, :level => 1, :prio => -20 }, { :match => /sh: .+: command not found/, :color => :magenta, :level => 1, :prio => -30 }, # IMPORTANT { :match => /^err ::/, :color => :red, :level => 0, :prio => -10 }, { :match => /.*/, :color => :blue, :level => 0, :prio => -20 }, ]
ほう、prepend を指定すると、ログの前に指定した文字列を追加できるようです。
in lib/capistrano/configuration.rb
module Capistrano class Configuration
このライブラリも既存のクラスを上書きするのね。colorize を DSL のように使いたいからだろうけど、別に CapistranoColors.colorize でもいいような。
in lib/capistrano/logger.rb
alias_method :org_log, :log def log(level, message, line_prefix=nil) #:nodoc:
上書きした Capistrano::Logger.log メソッドがこのライブラリのコアですね。条件にマッチした行に、ANSI エスケープシーケンスを追加している。
def self.add_color_matcher( options ) #:nodoc: @@color_matchers.push( options ) end
追加は push だけど、あら、条件の削除はできないようですね。:prio の高い条件を追加してくださいといことでしょうね。