Rails

【Rails】コード整形ツール「RuboCop」の導入・設定方法を初心者向けにまとめてみた

Rails

 

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

Rubyのメソッドや構文をRuboCopから学べるので、そういった面でもおすすめです。

RuboCopとは

RuboCop

 

RuboCopとは、Rubyコードを自動的に解析・整形してくれるツールです。インデントやメソッド名、余分な改行などをチェックすることで綺麗なコードを担保してくれます。また、RuboCopのコード基準はRubyStyleGuideに基づいているため、正しいコードの記述方法をここから学ぶこともできます。

ただRuboCopのコードは全て正しい訳ではなく、あくまでRubyStyleGuideに基づいて解析・指摘しているだけなので、全てを修正する必要はありません。

RuboCopにどこまで準拠するかは、プロジェクト毎に話し合うのがベストだね。

RuboCopを導入するメリット

続いてRuboCopを導入するメリットについて簡単に見ていきましょう。RuboCop導入のメリットは主に以下の3つです。

  • レビューにかかるコスト(時間、労力)を短縮できる
  • コードを統一することができる
  • お手本の記述方法が分かる

レビューにかかるコスト(時間、労力)を短縮できる

RuboCop導入の一番のメリットが、レビューコストを短縮できる点です。

レビュワーはコードの記述だけでなく余計なインデントや改行、スペースにまで目を配らなければなりません。想像しただけで大変です。しかしRuboCopを導入することでこういった細かなミスを指摘、自動修正してくれるのでレビューにかかるコストをグッと短縮することができます。

コードを統一することができる

チーム開発(スクラム開発)で立ちはだかる壁の一つが、コードの統一です。

どんなに有能な人が複雑な機能を瞬く間に作り上げたとしても、チームで開発し保守する以上は、それが他人に理解できるものでなければ意味がありません。なぜなら、たったひとりしか理解できないコードはその人にしか保守できないからです。

RuboCopはこういったことを避けるため、コードの統一化(ルールの設定)をすることができます。

お手本の記述方法が分かる

RuboCopはコードを指摘してくれるだけでなく、自動で修正してくれる機能もあります。

修正されたコードはRubyStyleGuideに基づいているため、いわゆるお手本のコードを学習することができます。これらを普段から使用することで、綺麗なコードの記述方法が身につくようになります。

自動修正してくれるコマンドは「bundle exec rubocop -a」です。

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'
上記の場合「Gemfile」「messages_controller.rb」「20200601022728_create_active_storage_tables.active_storage.rb」の3つが修正が必要なファイルになります。

 

例えば、以下のように「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を使用する流れを見ていきましょう。

  1. 「rubocop –auto-gen-config」を入力
  2. 「.rubocop_todo.yml」内の記述から修正したい警告をコメントアウト
  3. 「bundle exec rubocop」で修正内容を確認
  4. コードを修正
  5. 「bundle exec rubocop」でコードが修正されたか確認
  6. 「.rubocop_todo.yml」に戻りコメントアウトした警告を削除

「rubocop –auto-gen-config」を入力

まずはRuboCopの設定ファイルを生成しなければならないため、以下のコマンドを入力しましょう。そうすることで、アプリケーションディレクトリ直下に「.rubocop_todo.yml」と「.rubocop.yml」の2つのファイルが生成されます。

% rubocop --auto-gen-config
「rubocop –auto-gen-config」は「.rubocop_todo.yml」と「.rubocop.yml」という2つのファイルを生成するだけでなく、現在出ている警告を一時退避させることができます。

「.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人で開発する時も、複数人で開発する時も非常に便利なツールです。最初はコード修正でかなりの数怒られると思いますが、これらがコードの基準になります。ぜひ普段から導入し、綺麗なコードを目指していきましょう。

Convention over Configrationだね!