h1k Blog

【Rails】RuboCop の導入と使い方

RuboCop とは

Ruby の Linter / コードフォーマッターです ⚡ コードの品質やスタイルに関するチェックを自動で行うことができます。

RuboCop の導入の利点

  • ソースコードの品質向上
    • 共通のルールに従うことで、コードの可読性や保守性の向上が期待できる
  • チーム開発の効率化
    • チーム全体で同じルールに従ってコードを書くことでコードの一貫性を保つことができる
    • コードレビュー時に、設計や実装内容などの重要な箇所に集中できる
      • スタイルに関するチェックは RuboCop におまかせできる 💪

前提

Rails の開発環境として docker-compose を利用しています。そのため、コマンドの実行例は docker-compose コマンドが prefix としてついています。

インストール手順

Gemfile に以下の gem を追加します。

RuboCop には拡張機構があり、本体の rubocop gem に加え、今回は 3 つの gem を追加します。それぞれ パフォーマンス/Rails/RSpec に関するチェックをしてくれます。

group :development, :test do
  gem 'rubocop', require: false
  gem 'rubocop-performance', require: false
  gem 'rubocop-rails', require: false  
  gem 'rubocop-rspec', require: false
end

gem をインストールして、再ビルドします。

$ docker-compose run --rm web bundle install
$ docker-compose build

初期設定

プロジェクトのルートディレクトリに設定ファイルである .rubocop.yml を追加します。

以下が個人的な最小限の設定ファイルです。厳しすぎる点もあるかと思いますが、まずは厳し目でスタートして、ルール設定についてチームメンバーで議論を行うのが良いと思います 💡

require: # 拡張機能をロードするように設定
  - rubocop-rails
  - rubocop-rspec
  - rubocop-performance

AllCops:
  # 最新のルールを適用する
  NewCops: enable
  Exclude:
    - 'vendor/**/*'
    - 'bin/**/*'
    - 'db/**/*'
    - 'tmp/**/*'
    - 'node_modules/**/*'

### Style

# 日本語コメントを許可
Style/AsciiComments:
  Enabled: false
# クラスとモジュールのトップレベルドキュメントがなくても許可
Style/Documentation:
  Enabled: false

使用方法

以下のコマンドを実行するだけです!RuboCop による静的解析がスタートして、チェック結果が出力されます。

$ docker-compose run --rm web rubocop
Inspecting 23 files
.......................

23 files inspected, no offenses detected

自動修正は以下のコマンドで実行できます。チェック結果でCorrectableと記載されている警告が自動で修正されます。

オプションの詳細はドキュメントをご確認ください。

$ docker-compose run --rm web rubocop -a
$ docker-compose run --rm web rubocop -A # Unsafe な修正含む

ルール(Cop)の無効化

ルールの無効化は、目的に応じて 3 つの方法があります。以下の基準でそれぞれの対応をしていくのが良いと思います。

  1. プロジェクト全体、もしくは特定のファイルで無効化したいもの → .rubocop.yml に追加
  2. 直ぐの対応はできないが、今後対応予定のもの → .rubocop_todo.yml に追加
  3. プロジェクト全体では有効化したいものの、一部のコードは警告を許可したい → コードにコメント

なお、コードコメントでの無効化はメソッド単位や行ごとで可能です。

def generate_base_json # rubocop:disable Metrics/MethodLength
  ...
end

User.insert_all!(user_attributes) # rubocop:disable Rails/SkipsModelValidations

CI の設定

CI の設定を行うことで、RuboCop のルールを自動でチェックできるようになります 💪

以下は Github Actions での設定例になります。

name: Rails CI
on:
  pull_request:

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Install Ruby and gems
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
      - name: Lint Ruby files
        run: bundle exec rubocop --parallel