RuboCopのインストール手順と具体的な使い方

Ruby

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-performancerubocop-railsrubocop-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.ymlinherit_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-performancerubocop-railsrubocop-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の設定は.rubocop.ymlに記述する
  • RuboCopの暫定対応・後でやるリストは.rubocop.ymlに記述する
  • 『inherit_from』で別ファイルのRuboCopの設定を反映できる
  • 『rubocop -a』もしくは『rubocop -A』で自動修正

RuboCopの具体的なカスタマイズ手順についてはRuboCop導入後の設定カスタマイズ方法で紹介していますのであわせてご覧になってください。

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!