はじめに
[Rails] RuboCopの導入の記事では、設定に関する記述を省略したのでこちらにまとめる。
構成ファイル
RuboCopの動作は.rubocop.yml
構成ファイルを介して制御を行う。
つまりはこのファイルでRuboCopの動作を決めるみたい。
構成ファイルの場所は「検査されたファイルがあるディレクトリで構成ファイルの検索を行い、ルートディレクトリまで進む」とドキュメントある。
つまり、実行時にその都度プロジェクトにある構成ファイルの場所を参照するようだ。
構成ファイルの場所
# 最初に参照される設定ファイル
- ~/.rubocop.yml
# ルートディレクトリに設定ファイルが見つからない場合の参照先
- $XDG_CONFIG_HOME/rubocop/config.yml
~/.config/rubocop/config.yml)
両方のファイルが存在する場合は、ドットファイルが優先される。
デフォルトの構成
RuboCopはRubocopホームディレクトリ下のconfig/default.yml
ファイルに、全ての構成が継承するようにデフォルト設定が含まれているらしい。
プロジェクトの.rubocop.yml
構成ファイルは全て、このデフォルトの設定を継承するため、プロジェクト固有の設定は.rubocop.yml
に記述するだけで済むとのことだ。
設定ファイルの見方
AllCops:
Include:
- foo.unusual_extension
- '**/*.rb'
- '**/*.gemfile'
- '**/*.gemspec'
- '**/*.rake'
- '**/*.ru'
- '**/Gemfile'
- '**/Rakefile'
Exclude:
- 'db/**/*'
- 'config/**/*'
- 'script/**/*'
- 'bin/{rails,rake}'
- !ruby/regexp /old_and_unused\.rb$/
AllCops: とは、リストされる任意のパターンに一致するファイルの宣言を行う。
Include: とは、リストされる任意のパターンに一致するファイルを検査する。
Exclude: とは、リストされる任意のパターンに一致するファイルを検査対象から除外する。
構成ファイルは、デフォルトの設定を継承すると同時に子はInclude:でオーバーライドするものであることに注意。
注意事項
Rubocopをコマンドライン引数として特定のディレクトリ(ファイル)を指定して検査する場合、AllCops/にリストされるExcludeも検査を行うことができてしまう。
そのためExcludeのルールを適用するには--force-exclusion
を追加する必要がある。
# Excludeのルールを無視する
bundle exec rubocop foo.rb
# Excludeのルールを適用する
bundle exec rubocop --force-exclusion foo.rb
デフォルトで含まれていないファイルをRunocopで検査する場合、コマンドラインでファイルを渡すか、AllCops/にリストを追加する必要がある。
有効/無効の切り替え
特定の検査の設定をEnabled: false
を指定することで、特定の検査の無効化ができる。ほとんどはデフォルトで有効になっているが、有効/無効/保留の3つ状態がある。
Layout/LineLength:
Enabled: false
検査の有効化プロセスではDisabledByDefault
またはEnabledByDefault
をtrue
に設定することで変更が可能。
検査の状態に関係なく、全ての検査のデフォルトを無効/有効に切り替える。
AllCops:
DisabledByDefault: true
上記で全体の検査がデフォルトで無効になった。
そこからユーザーの構成ファイルにEnabled: true
される検査のみが有効になるように設定できる。
Style:
Enabled: true
上記だとStyle:
の範囲が全て有効化されたことになる。
また無効を指定した範囲から、さらに個別に有効化することも可能である。
inherit_from: config_that_disables_the_metrics_department.yml
Metrics/MethodLength:
Enabled: true
Style:
Enabled: false
Style/Alias:
Enabled: true
inherit_from:
は、プロジェクト内の別の構成ファイルから継承を行うものである。つまりは、共通の設定なんかをファイルを別にして読み込むのに使われるもの。
inherit_from:
の参照先ファイルは、絶対パスでも相対パスでも指定が可能である。
また参照先が複数ある場合、最初のファイルが最も優先順位が低く、最後のファイルが最も優先順位が高いとある。
inherit_from:
- ../.rubocop.yml
- ../conf/.rubocop.yml
検査部門
Rubocop用語では、コードに対して実行される様々なチェックを「cops」と呼ぶらしい。
「cops」は特定の違反を検出する責任があり、その違反の部門ごとに「cops」はグループ化されている。
下記の表は簡単な部門の説明である。
部門 | 検査内容 |
---|---|
Style | コードのスタイルの一貫性を検査する。 |
Layout | インデント、配置、余白を一貫して使用しているか検査する。 |
Lint | コードの曖昧さや、考えられるエラーを検査する。rubocop -l でLintだけを走らせることも可能。 |
Metrics | クラス・メソッドの長さなど、測定可能なソースコードのプロパティを処理する。 |
Naming | メソッド名、定数名、ファイル名など、コードの名付けの問題を検査する。 |
Security | 潜在的なセキュリティ問題に関連していることがわかっているメソッド呼び出しと構造を検査する。 |
Bundler | bundlerファイル(Gemfile)のスタイルと悪い習慣をチェックする。 |
Gemspec | gemspecファイル(rubocop.gemspec)のスタイルと悪い習慣を検査する。 |
詳細はこちらから。