目次
RuboCopとは
RuboCopとはRuby用のLintツールです。
設定ファイルを編集することでコーディングスタイルのチェック項目をカスタマイズできたり、RuboCop用のgemを追加することで機能の拡張ができたりします。
コードに対して行われるさまざまなチェックをRuboCopではCopと呼びます。
RuboCopの設定ファイルについて
RuboCopを利用するうえで重要な.rubocop.yml
と.rubocop_todo.yml
について紹介します。
設定ファイルの詳細はRuboCop//Docs『Configuration』を参照してください。
.rubocop.ymlとは
.rubocop.yml
とはRuboCopの設定ファイルです。
RuboCop自身に関する設定だけでなく、Copの有効無効の制御やCopのカスタマイズをする際にも利用します。
.rubocop_todo.ymlとは
.rubocop_todo.yml
はRuboCopの暫定対応をする際に利用する設定ファイルです。
たとえば、プロジェクトの途中からRuboCopを導入すると既存のソースコードに大量の指摘事項が見つかる場合があります。
指摘事項が多い場合「いつかは直す必要があるけどいったん無視して、とりあえずRuboCopから指摘されないようにだけしたい」と考えたとします。
.rubocop_todo.yml
は上記のようなシチュエーションで利用します。
Railsプロジェクトにrubocopを導入する手順
利用するrubocopのバージョンは1.18.3です。
Gemのインストール
rubocop
をGemfileに追加します。また、Railsアプリケーションでrubocop
を利用する際によく導入されているrubocop-performance、rubocop-rails、rubocop-rspecもあわせて追加します。
Gemfile
group :development do
gem 'rubocop', require: false
gem "rubocop-performance", require: false
gem "rubocop-rails", require: false
gem "rubocop-rspec", require: false
end
.rubocop.ymlの作成
Railsアプリケーションのルートディレクトリに.rubocop.yml
を作成します。
$ cd /path/to/project
$ touch .rubocop.yml
.rubocop_todo.ymlの作成
.rubocop_todo.yml
は以下のコマンドで自動生成されます。
$ rubocop --auto-gen-config
上記のコマンドは.rubocop_todo.yml
の作成以外のことも実行してくれます。rubocop --auto-gen-config
で行われる内容は以下の通りです。
- .rubocop_todo.ymlの作成
- (.rubocop.ymlがない場合).rubocop.ymlの作成
- .rubocop.ymlに『inherit_from: .rubocop_todo.yml』を追加
- 現時点でのCopによる指摘箇所を.rubocop_todo.ymlに追加
inherit_from:
は設定を読み込む際に利用するオプションです。
つまり、.rubocop.yml
にinherit_from: .rubocop_todo.yml
が追加すると.rubocop_todo.yml
の内容が.rubocop.yml
に反映されます。
.rubocop.ymlの編集
.rubocop.yml
にRuboCopの基本的な設定を追加します。
.rubocop_todo.ymlの内容を反映できるようにする
.rubocop_todo.yml
を利用しない場合、この手順はスキップしてOKです。
inherit_from: .rubocop_todo.yml
を追加して.rubocop_todo.yml
の設定が読み込まれるようにします。
.rubocop.yml
inherit_from: .rubocop_todo.yml
RuboCopの機能を拡張する
RuboCop用のgemを導入している場合はrequire
オプションを追加する必要があります。
今回はrubocop-performance、rubocop-rails、rubocop-rspecを利用するため、以下のように編集します。
.rubocop.yml
require:
- rubocop-performance
- rubocop-rails
- rubocop-rspec
最新のCopを自動で有効にする
NewCops: enable
を追加することで、RuboCopのバージョンがあがった際に追加されたCopを自動で有効にできます。
NewCops: enable
の設定は任意ですが、新たなCopに追従していくために特に理由がなければ有効にしておくとよいでしょう。
.rubocop.yml
# AllCopsオプションで全てのCopsを対象にできる
AllCops:
NewCops: enable
最終的なコード
.rubocop.yml
inherit_from: .rubocop_todo.yml
require:
- rubocop-performance
- rubocop-rails
- rubocop-rspec
AllCops:
NewCops: enable
RuboCopの使い方
具体例をもとにRuboCopの使い方について紹介します。
利用するrubocopのバージョンは1.18.3です。
サンプルコードの作成
以下のようなサンプルコードを用意します。
lib/example.rb
def bad_method
Rails.logger "bad method"
end
RuboCopの実行
RuboCopの実行方法は以下の通りです。
### 全てのファイルをチェックする場合
$ rubocop
### 特定のディレクトリ配下のファイルのみチェックする場合
$ rubocop [ディレクトリ名]
### 特定のファイルのみチェックする場合
$ rubocop [ファイル名]
コーディングスタイルに問題のあるコードは実行結果で表示されます。
たとえば、lib/example.rb
に対してRuboCopを実行する場合は以下のようになります。
$ rubocop lib/example.rb
Inspecting 1 file
C
Offenses:
lib/example.rb:1:1: C: [Correctable] Style/FrozenStringLiteralComment: Missing frozen string literal comment.
def bad_method
^
lib/example.rb:2:16: C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
Rails.logger "bad method"
^^^^^^^^^^^^
1 file inspected, 2 offenses detected, 2 offenses auto-correctable
RuboCopでコードを自動修正する
Correctable
と記載されているものは自動で修正できます。
自動修正には以下の2つのオプションがあります。1
オプション | 内容 |
---|---|
-a | SafeなCopのみ自動修正 |
-A | Safe、UnsafeなCopを自動修正 |
Unsafe
は自動修正によって挙動が変わる可能性のあるものです。
安全に自動修正したいのであれば-a
を利用したほうがよいでしょう。
-A
を利用した場合は自動修正後の差分で挙動が変わらないか確認したほうがよいでしょう。
今回は-A
を利用してサンプルコードを修正してみます。
$ rubocop -A lib/example.rb
Inspecting 1 file
C
Offenses:
lib/example.rb:1:1: C: [Corrected] Style/FrozenStringLiteralComment: Missing frozen string literal comment.
def bad_method
^
lib/example.rb:2:1: C: [Corrected] Layout/EmptyLineAfterMagicComment: Add an empty line after magic comments.
def bad_method
^
lib/example.rb:2:16: C: [Corrected] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
Rails.logger "bad method"
^^^^^^^^^^^^
1 file inspected, 3 offenses detected, 3 offenses corrected
rubocop -A
実行後、再びrubocop
を実行するとRuboCopによる指摘が修正されていることがわかります。
$ rubocop lib/example.rb
Inspecting 1 file
.
1 file inspected, no offenses detected
Correctable
でない箇所に関しては指摘事項を確認し、手動で修正します。
今回のまとめ
- RuboCopの設定は.rubocop.ymlに記述する
- RuboCopの暫定対応・後でやるリストは.rubocop.ymlに記述する
- 『inherit_from』で別ファイルのRuboCopの設定を反映できる
- 『rubocop -a』もしくは『rubocop -A』で自動修正
RuboCopの具体的なカスタマイズ手順についてはRuboCop導入後の設定カスタマイズ方法で紹介していますのであわせてご覧になってください。
Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!