前回、RuboCopのインストール手順と具体的な使い方でRuboCopのインストール手順について紹介しました。
RuboCopは導入して終わりではなく、プロジェクトのコーディングスタイルに適した形へカスタマイズする必要があります。
今回はRubuCopのカスタマイズ方法についてシチュエーション別で紹介します。
目次
Copを無効にしたい場合
Copを無効にしたい場合については『恒久対応として扱う場合』と『暫定対応として扱う場合』の2つのケースを紹介します。
恒久対応として扱う場合
RuboCopで指摘されたが直す必要がない・直したくないケースです。
恒久対応としてCopを無効にする設定は以下の通りです。
.rubocop.yml
[Cop名]:
Enabled: false
具体例を紹介します。
rubocop
実行後、以下のようにStyle/Documentation
に関する指摘が複数表示されたとします。
Style/Documentation
はクラスの説明がコメントで書かれているかチェックするCopです。
$ rubocop
Inspecting 30 files
.......C.C.................C..
Offenses:
app/models/application_record.rb:3:1: C: Style/Documentation: Missing top-level class documentation comment.
class ApplicationRecord < ActiveRecord::Base
^^^^^
config/application.rb:24:1: C: Style/Documentation: Missing top-level class documentation comment.
class Rails6ApiMysql8::Application < Rails::Application
^^^^^
lib/example/hoge.rb:3:1: C: Style/Documentation: Missing top-level class documentation comment.
class Example::Hoge
^^^^^
30 files inspected, 3 offenses detected
Style/Documentation
を無効にする設定は以下の通りです。
.rubocop.yml
Style/Documentation:
Enabled: false
上記の設定を追加後、再度rubocop
を実行するとStyle/Documentation
が表示されなくなります。
$ rubocop
Inspecting 30 files
..............................
30 files inspected, no offenses detected
暫定対応として扱う場合
いずれ直す必要はあるがいったんCopの対応を保留にしておきたいケースです。
暫定対応として扱う場合は.rubocop_todo.yml
に設定を記述します。
暫定対応としてCopを無効にする設定は以下の通りです。
.rubocop.yml
inherit_from: .rubocop_todo.yml
.rubocop_todo.yml
[Cop名]:
Enabled: false
具体例については設定ファイルの変更箇所のみ違うだけでそのほかは恒久対応の場合と同じなので省略します。
Copの設定を編集したい場合
Cop自体は必要だが現在適用されている設定がアプリケーションのコーディングスタイルにあっていないためカスタマイズしたいというケースです。
Copの設定を編集する場合は以下のように記述します。
.rubocop.yml
[Cop名]:
[オプション名]: [値]
具体例を紹介します。
rubocop lib/example/hoge.rb
実行後、以下のようにStyle/ClassAndModuleChildren
に関する指摘が表示されたとします。
Style/ClassAndModuleChildren
はクラス内クラスの記述方法をチェックするCopです。
$ rubocop lib/example/hoge.rb
Inspecting 1 file
C
Offenses:
lib/example/hoge.rb:3:7: C: [Correctable] Style/ClassAndModuleChildren: Use nested module/class definitions instead of compact style.
class Example::Hoge
^^^^^^^^^^^^^
1 file inspected, 1 offense detected, 1 offense auto-correctable
上記の指摘はStyle/ClassAndModuleChildren
のEnforcedStyle
オプションをcompact
にすることで解決します。
Style/ClassAndModuleChildren
の設定を編集する方法は以下の通りです。
.rubocop.yml
Style/ClassAndModuleChildren:
EnforcedStyle: compact
上記の設定を追加後、再度rubocop lib/example/hoge.rb
を実行するとStyle/ClassAndModuleChildren
に関する指摘が表示されなくなります。
$ rubocop lib/example/hoge.rb
Inspecting 1 file
.
1 file inspected, no offenses detected
ファイルをRuboCopの対象外にしたい場合
ファイルをRuboCopの対象外にしたい場合については『恒久対応として扱う場合』と『暫定対応として扱う場合』の2つのケースを紹介します。
恒久対応として扱う場合
そもそもコーディングスタイルをチェックするようなファイルではないというケースです。
恒久対応としてファイルをRuboCopの対象外にする設定は以下の通りです。
.rubocop.yml
AllCops:
Exclude:
- [ファイル名] # 特定のファイルを除外したい場合
- [ディレクトリ名] # 特定のディレクトリを除外したい場合
具体例を紹介します。
rubocop
実行後、以下のようにlib/example/hoge.rb
に対して複数のCopが表示されたとします。
$ rubocop
Inspecting 30 files
...........................C..
Offenses:
lib/example/hoge.rb:3:1: C: Style/Documentation: Missing top-level class documentation comment.
class Example::Hoge
^^^^^
lib/example/hoge.rb:3:7: C: [Correctable] Style/ClassAndModuleChildren: Use nested module/class definitions instead of compact style.
class Example::Hoge
^^^^^^^^^^^^^
30 files inspected, 2 offenses detected, 1 offense auto-correctable
lib/example/hoge.rb
をRuboCopの対象外にする設定は以下の通りです。
AllCops:
Exclude:
- 'lib/example/hoge.rb'
上記の設定を追加後、再度rubocop
を実行するとlib/example/hoge.rb
が表示されなくなります。
$ rubocop
Inspecting 30 files
..............................
30 files inspected, no offenses detected
暫定対応として扱う場合
コーディングスタイルをチェックすべきファイルだが指摘箇所が多すぎるなどの理由で修正は保留にしておきたいケースです。
暫定対応として扱う場合は.rubocop_todo.yml
に設定を記述します。
暫定対応としてファイルをRuboCopの対象外にする設定は以下の通りです。
.rubocop.yml
inherit_from: .rubocop_todo.yml
.rubocop_todo.yml
AllCops:
Exclude:
- [ファイル名] # 特定のファイルを除外したい場合
- [ディレクトリ名] # 特定のディレクトリを除外したい場合
具体例については設定ファイルの変更箇所のみ違うだけでそのほかは恒久対応の場合と同じなので省略します。
ファイルをCopの対象外にしたい場合
ファイルをCopの対象外にしたい場合については『恒久対応として扱う場合』と『暫定対応として扱う場合』の2つのケースを紹介します。
恒久対応として扱う場合
有効にしているCopだが特定のファイルでは無効にしたい・無効にしてよいというケースです。
恒久対応としてファイルをCopの対象外にする設定は以下の通りです。
.rubocop.yml
[Cop名]:
Exclude:
- [ファイル名] # 特定のファイルを除外したい場合
- [ディレクトリ名] # 特定のディレクトリを除外したい場合
具体例を紹介します。
rubocop lib/example/hoge.rb
実行後、以下のようにStyle/Documentation
に関する指摘が複数表示されたとします。
$ rubocop lib/example/hoge.rb
Inspecting 1 file
C
Offenses:
lib/example/hoge.rb:4:3: C: Style/Documentation: Missing top-level class documentation comment.
class Hoge
^^^^^
1 file inspected, 1 offense detected
lib/example/hoge.rb
でStyle/Documentation
を無効にする設定は以下の通りです。
.rubocop.yml
Style/Documentation:
Exclude:
- 'lib/example/hoge.rb'
上記の設定を追加後、再度rubocop lib/example/hoge.rb
を実行するとStyle/Documentation
に関する指摘が表示されなくなります。
$ rubocop lib/example/hoge.rb
Inspecting 1 file
.
1 file inspected, no offenses detected
暫定対応として扱う場合
あるファイルにおいて特定のCopの対応のみいったん保留にしておきたいケースです。
暫定対応として扱う場合は.rubocop_todo.yml
に設定を記述します。
暫定対応としてファイルをCopの対象外にする設定は以下の通りです。
.rubocop.yml
inherit_from: .rubocop_todo.yml
.rubocop_todo.yml
[Cop名]:
Exclude:
- [ファイル名] # 特定のファイルを除外したい場合
- [ディレクトリ名] # 特定のディレクトリを除外したい場合
具体例については設定ファイルの変更箇所のみ違うだけでそのほかは恒久対応の場合と同じなので省略します。
コードの一部をCopの対象外にしたい場合
ファイル自体はCopの対象で問題ないが、特定の部分のみCopを無効化したいケースです。
コードの一部をCopの対象外にする設定は以下の通りです。
# rubocop:disable [Cop名]
#
# 処理
#
# rubocop:enable [Cop名]
具体例を紹介します。
以下のようなコードを含むconfig/environments/development.rb
があるとします。
config/environments/development.rb
(略)
if Rails.root.join('tmp', 'caching-dev.txt').exist?
config.cache_store = :memory_store
config.public_file_server.headers = {
'Cache-Control' => "public, max-age=#{2.days.to_i}"
}
else
config.action_controller.perform_caching = false
config.cache_store = :null_store
end
(略)
rubocop config/environments/development.rb
を実行すると以下のようにRails/FilePath
に関する指摘が表示されます。
$ rubocop config/environments/development.rb
Inspecting 1 file
C
Offenses:
config/environments/development.rb:19:6: C: Rails/FilePath: Prefer Rails.root.join('path/to').
if Rails.root.join('tmp', 'caching-dev.txt').exist?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1 file inspected, 1 offense detected
上記の指摘箇所を無効化する方法は以下の通りです。
config/environments/development.rb
# rubocop:disable Rails/FilePath
if Rails.root.join('tmp', 'caching-dev.txt').exist?
config.cache_store = :memory_store
config.public_file_server.headers = {
'Cache-Control' => "public, max-age=#{2.days.to_i}"
}
else
config.action_controller.perform_caching = false
config.cache_store = :null_store
end
# rubocop:enable Rails/FilePath
コメント追加後、再度rubocop config/environments/development.rb
を実行するとRails/FilePath
に関する指摘が表示されなくなります。
$ rubocop config/environments/development.rb
Inspecting 1 file
.
1 file inspected, no offenses detected
さいごに
Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!