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