今回はRubyコードの自動整形ツール「RuboCop」の導入、設定方法について初心者向けに解説したいと思います。綺麗なコード、お手本のコードを理解する上でも非常に参考になるツールですので、ぜひこの機会に導入しておきましょう。
RuboCopとは

RuboCopとは、Rubyコードを自動的に解析・整形してくれるツールです。インデントやメソッド名、余分な改行などをチェックすることで綺麗なコードを担保してくれます。また、RuboCopのコード基準はRubyStyleGuideに基づいているため、正しいコードの記述方法をここから学ぶこともできます。
ただRuboCopのコードは全て正しい訳ではなく、あくまでRubyStyleGuideに基づいて解析・指摘しているだけなので、全てを修正する必要はありません。
RuboCopを導入するメリット
続いてRuboCopを導入するメリットについて簡単に見ていきましょう。RuboCop導入のメリットは主に以下の3つです。
- レビューにかかるコスト(時間、労力)を短縮できる
- コードを統一することができる
- お手本の記述方法が分かる
レビューにかかるコスト(時間、労力)を短縮できる
RuboCop導入の一番のメリットが、レビューコストを短縮できる点です。
レビュワーはコードの記述だけでなく余計なインデントや改行、スペースにまで目を配らなければなりません。想像しただけで大変です。しかしRuboCopを導入することでこういった細かなミスを指摘、自動修正してくれるのでレビューにかかるコストをグッと短縮することができます。
コードを統一することができる
チーム開発(スクラム開発)で立ちはだかる壁の一つが、コードの統一です。
どんなに有能な人が複雑な機能を瞬く間に作り上げたとしても、チームで開発し保守する以上は、それが他人に理解できるものでなければ意味がありません。なぜなら、たったひとりしか理解できないコードはその人にしか保守できないからです。
RuboCopはこういったことを避けるため、コードの統一化(ルールの設定)をすることができます。
お手本の記述方法が分かる
RuboCopはコードを指摘してくれるだけでなく、自動で修正してくれる機能もあります。
修正されたコードはRubyStyleGuideに基づいているため、いわゆるお手本のコードを学習することができます。これらを普段から使用することで、綺麗なコードの記述方法が身につくようになります。
RuboCopの設定ファイル
RuboCopで使用するファイルは以下の2つになります。RuboCopを実際に使用する前に目を通しておきましょう。
- .rubocop_todo.yml
- .rubocop.yml
.rubocop_todo.yml
「.rubocop_todo.yml」は既存のコードを解析し、RuboCopの監視から除外するコードを設定するファイルです。gitでいう所の「.gitignore」に近いイメージです。
「.rubocop_todo.yml」には以下のようにコード修正する必要があるファイルが記載されており、コード修正後は該当行を削除します。
# .rubocop_todo.yml(一例)
Bundler/OrderedGems:
Exclude:
- 'Gemfile'
Layout/EmptyLinesAroundAccessModifier:
Exclude:
- 'app/controllers/messages_controller.rb'
Layout/SpaceInsideArrayLiteralBrackets:
Exclude:
- 'config/environments/production.rb'
- 'db/migrate/20200601022728_create_active_storage_tables.active_storage.rb'
例えば、以下のように「messages_controller.rb」が「.robocop_todo.yml」に記載されていたとします。その場合「messages_controller.rb」の中にコードの修正箇所が存在していることになります。
# .rubocop_todo.yml
Bundler/OrderedGems:
Exclude:
- 'app/controllers/messages_controller.rb'
コード修正後は忘れずに「messages_controller.rb」の3行を削除しましょう。
# .rubocop_todo.yml
↓ 以下の3行を削除
Bundler/OrderedGems:
Exclude:
- 'app/controllers/messages_controller.rb'
.rubocop.yml
「.rubocop.yml」はコードチェックの基準を設定するファイルです。コードの統一、許容する記述といった設定はこのファイルで定義します。
デフォルトでは、自動生成されたコード(rails newで作成されたコード)や許容してもいい記述まで警告が出てしまうため、以下のように編集することをおすすめします。
# .rubocop.yml
AllCops:
# 除外するディレクトリ(自動生成されたファイル)
# デフォルト設定にある"vendor/**/*"が無効化されないように記述
Exclude:
- bin/*
- db/schema.rb
- db/migrate/*
- vendor/**/*
# Rails向けのRails copsを実行。"rubocop -R"と同じ
RunRailsCops: true
# "Missing top-level class documentation comment."を無効
Style/Documentation:
Enabled: false
# "Prefer single-quoted strings when you don't need string interpolation or special symbols."を無効
Style/StringLiterals:
Enabled: false
# "Line is too long"を無効
Metrics/LineLength:
Enabled: false
参考:https://wonderwall.hatenablog.com/entry/2015/08/17/213718
RuboCopの導入方法
では実際にRuboCopを導入してみましょう。
RuboCopはbundlerを用いて導入が可能なため、非常に簡単にインストールすることができます。以下のように記述、実行しましょう。
# Gemfile
gem 'rubocop', require: false
% bundle install
RuboCopを使用する流れ
次に、RuboCopを使用する流れを見ていきましょう。
- 「rubocop –auto-gen-config」を入力
- 「.rubocop_todo.yml」内の記述から修正したい警告をコメントアウト
- 「bundle exec rubocop」で修正内容を確認
- コードを修正
- 「bundle exec rubocop」でコードが修正されたか確認
- 「.rubocop_todo.yml」に戻りコメントアウトした警告を削除
「rubocop –auto-gen-config」を入力
まずはRuboCopの設定ファイルを生成しなければならないため、以下のコマンドを入力しましょう。そうすることで、アプリケーションディレクトリ直下に「.rubocop_todo.yml」と「.rubocop.yml」の2つのファイルが生成されます。
% rubocop --auto-gen-config
「.rubocop_todo.yml」内の記述から修正したい警告をコメントアウト
「.rubocop_todo.yml」が以下のように記載されていた場合、Gemfileの警告が一時退避されています。
# .rubocop_todo.yml
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2020-08-19 10:11:38 UTC using RuboCop version 0.89.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 1
# Configuration parameters: Include.
# Include: **/*.gemfile, **/Gemfile, **/gems.rb
Bundler/DuplicatedGem:
Exclude:
- 'Gemfile'
警告を修正したいコードをコメントアウトしましょう。今回はGemfileの警告を修正するため、以下のように最下部の3行をコメントアウトをします。
# .rubocop_todo.yml
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2020-08-19 10:11:38 UTC using RuboCop version 0.89.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 1
# Configuration parameters: Include.
# Include: **/*.gemfile, **/Gemfile, **/gems.rb
# Bundler/DuplicatedGem:
# Exclude:
# - 'Gemfile'
「bundle exec rubocop」で修正内容を確認
ターミナルで「bundle exec rubocop」を打ち込むことで、コードの修正内容を確認することができます。
% bundle exec rubocop
Offenses:
Gemfile:40:17: C: Style/HashSyntax: Use hash rockets syntax.
gem 'byebug', platform: :mri
^^^^^^^^^
Gemfile:67:20: C: Style/HashSyntax: Use hash rockets syntax.
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
コードを修正
RuboCopで指摘された警告文を確認すると、「Use has rockets syntax.」と書かれています。これは「ハッシュロケットを使用して記述しましょう」ということを警告してくれています。
以下のように修正します。
# Gemfile
gem 'byebug', :platform => :mri
gem 'tzinfo-data', :platforms => [:mingw, :mswin, :x64_mingw, :jruby]
「bundle exec rubocop」でコードが修正されたか確認
コードの修正が完了したので、再度RuboCopを使用して修正内容を確認しましょう。
% bundle exec rubocop
Inspecting 70 files
......................................................................
70 files inspected, no offenses detected
「no offenses detected」が表示されたので、コードの修正が成功していることになります。
「.rubocop_todo.yml」に戻りコメントアウトした警告を削除
警告文を修正したので、「.rubocop_todo.yml」からも該当の記述を削除しましょう。
# .rubocop_todo.yml
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2020-08-19 10:11:38 UTC using RuboCop version 0.89.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 1
# Configuration parameters: Include.
# Include: **/*.gemfile, **/Gemfile, **/gems.rb
↓ 以下の3行を削除
# Bundler/DuplicatedGem:
# Exclude:
# - 'Gemfile'
以上までがRuboCopを用いたコード修正の流れになります。
参考文献
RuboCop Github:
https://github.com/rubocop-hq/rubocop
今回はRubyコードの自動整形ツール「RuboCop」について解説しました。
RuboCopは1人で開発する時も、複数人で開発する時も非常に便利なツールです。最初はコード修正でかなりの数怒られると思いますが、これらがコードの基準になります。ぜひ普段から導入し、綺麗なコードを目指していきましょう。