【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 つの方法があります。以下の基準でそれぞれの対応をしていくのが良いと思います。
- プロジェクト全体、もしくは特定のファイルで無効化したいもの →
.rubocop.yml
に追加 - 直ぐの対応はできないが、今後対応予定のもの →
.rubocop_todo.yml
に追加 - プロジェクト全体では有効化したいものの、一部のコードは警告を許可したい → コードにコメント
なお、コードコメントでの無効化はメソッド単位や行ごとで可能です。
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