Railsノート - Thor によるメッセージの色付けをやめさせる

久しぶりに Rails を触る。rails generate とかやるとメッセージに色が付くようになっていた。お、見やすいじゃんと思ったのも束の間、端末エミュレータの背景色と同化して一部の文字が見えていないことが判明。

調べると、rails generate は Thor というライブラリを叩いていて、これがメッセージの着色もやっている模様。

で、案の定、文字色の指定はハードコードされていて、こちらで使っている端末エミュレータの色設定などお構いなしだった。もー、赤と緑だけ使ってくれればいいものを、なんでそう多彩な色を使おうとするかなー。背景色は黒とは限らないんだぞー。

なんとかならないもんかと Thor のコードを見ていたら、環境変数 THOR_SHELL を "Basic" に設定すれば色付けなしにできることを発見↓

# thor-0.14.6/lib/thor/shell.rb

class Thor
  module Base
    # Returns the shell used in all Thor classes. If you are in a Unix platform
    # it will use a colored log, otherwise it will use a basic one without color.
    #
    def self.shell
      @shell ||= if ENV['THOR_SHELL'] && ENV['THOR_SHELL'].size > 0
        Thor::Shell.const_get(ENV['THOR_SHELL'])
      elsif RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
        Thor::Shell::Basic
      else
        Thor::Shell::Color
      end
    end

というわけで、zshrc にて

export THOR_SHELL=Basic

とやって、無事にメッセージが読めるようになった。やれやれ。*1

その後さらに調べると

config/application.rb にて

    config.generators.colorize_logging = false

と設定することでも同じ効果が得られることがわかった。

ただ、この方法だとアプリケーションを新規に作るたびに設定しなければならないし、「自分の端末の色設定では色付けされた文字が見にくい!」というような理由でアプリケーションの設定をいじるのもどうかと思う*2ので、この場合*3環境変数 THOR_SHELL の設定で対応すべきだろう。

*1:上のコードを見る限りでは、自分でサブクラスを書いてそれを使わせることもできるようだが、さすがにそこまでやりたくない。

*2:開発環境に関する設定をアプリケーション側で行うべきではないだろう。

*3:自分の端末の色設定の都合で色付けを抑制したい場合