はちびる日記

Rubocopでコーディングルールを変更する

Rubocopでコーディングルールをデフォルトのものから変更したい場合、プロジェクトディレクトリに.rubocop.ymlを作成してそこにルールを書くことで、デフォルトのルールを上書きすることができます。

.rubocop.ymlは手動で作成してもよいですが、既存のプロジェクトのコードを基にルール定義ファイルを自動生成することもできます。

ルール定義ファイルの自動生成

プロジェクトのルートディレクトリに移動しrubocop --auto-gen-configコマンドを実行すると、プロジェクト内のコードを解析されルールの定義ファイル.rubocop_todo.ymlが生成されます。

$ cd <project_root_dir>
$ rubocop --auto-gen-config

この.rubocop_todo.ymlには、現在のコードを正とし、特定のルールを無効にしたり最大値を変更するなど、デフォルトのルールを上書きするためのルールが出力されます。

例えば.rubocop_todo.ymlには以下のようなルールが出力されます。

# コメントにASCII以外の文字コードを使用することを禁止(デフォルトはtrue(有効))
Style/AsciiComments:
  Enabled: false

# メソッドの最大行数(デフォルトは10行)
Style/MethodLength:
  Max: 22

プロジェクトへのルールの適用

.rubocop_todo.ymlは現在のコードを正とするための定義、つまりはデフォルトのルールに照らし合わせた場合にコードの修正が必要なもの一覧と言い換えることができます。(todoというファイル名は、修正が必要という意味合いです。)

(1) .rubocop_todo.ymlに出力されたルールをプロジェクトに適用する場合

単純に.rubocop_todo.ymlの定義を.rubocop.ymlにコピーすればOKです。

(2) .rubocop_todo.ymlに出力されたルールではなく、デフォルトのルールに準拠させたい場合

やっぱりデフォルトのルールの方がよい、という場合は、.rubocop.ymlにはルールを追加せずコードの方を修正します。

RubocopのREADMEでは、 デフォルトのルールに違反したコードが大量にある場合のアプローチとして、.rubocop.ymlinherit_from: .rubocop_todo.ymlを追加し.rubocop_todo.ymlを インクルードした上で(Rubocopでのコード解析実行時にルール違反の警告が表示されないようにした上で)コードを修正し、ルール違反を1つずつ潰していくワークフローが記載されています。

# .rubocop.ymlにrubocop-todo.ymlをインクルードするための定義を追加
$ echo 'inherit_from: rubocop-todo.yml' >> .rubocop.yml

また、.rubocop_todo.ymlにコメントで# Cop supports --auto-correct.と書かれたルールについては、rubocop -aまたはrubocop --auto-correctコマンドでコードを自動修正することができます。

# コードの自動修正
$ rubocop -a
# または
$ rubocop --auto-correct

補足事項

  • ディレクトリ(またはファイル)を指定してrubocopコマンド実行すると、指定したディレクトリ(または指定したファイルが含まれるディレクトリ)から順番に ルートディレクトリまで遡って.rubocop.ymlを探して、最初に見つかった.rubocop.ymlが有効になります。 (それより上位のディレクトリにある.rubocop.ymlのルールは有効になりません。)
  • ホームディレクトリの.rubocop.ymlはデフォルトでrubocopコマンド実行時の検索対象になっているので、全プロジェクトに同じルールを適用したい場合は ホームディレクトリに.rubocop.ymlに作成してもよいと思います。
  • ただし、ホームディレクトリの.rubocop.ymlは上記の「指定したディレクトリから…」よりも検索の優先順位が低いので、 .rubocop.ymlをホームディレクトリに置いた場合でも、ホームディレクトリと指定したディレクトリの.rubocop.ymlの和集合のルール、とはなりません。
  • 複数のルール定義ファイルをインクルードする場合は、上で触れた'inherit_from:ディレクティブに配列を渡します。
# 複数のルール定義ファイルをインクルードする場合
inherit_from:
  - .rubocop.yml
  - /Users/yuyawata/.rubocop.yml

[参考] RubocopのConfiguration

参考サイト

rubocop Ruby - Rubocopを使ってコーディングルールへの準拠チェックを自動化 - Qiita rubocopによる静的コード解析でRubyのコード品質を保つ | Act as Professional - hiroki.jp rubocop+syntasticでRubyのコーディングルールへの準拠チェックを自動化する - Glide Note - グライドノート

comments powered by Disqus

© Yutaka Yawata 2014-2015. All right reserved.