一撃で理解できる❗️RuboCopの導入法(コード品質向上には必須)
RuboCopとは何か
Railsを使う現場でよく使われていて、
自分や他のメンバーがコマンド1つでコードを解析してくれる便利なGemです。
「もっとこう書くといいぞ!」とか「こんな書き方はだめだー」とか
色々指摘してコードの品質向上に貢献してくれるめちゃくちゃ便利なツールです。
RuboCopのメリット
1.業務のコードの品質向上
2.自分が書くコードが綺麗になる
この2点は現場では特に大事です。
コードの品質が悪いとバグにつながってしまいますし、汚いコードばかり書いていると
他のメンバーにも迷惑がかかります。
こんなメリットしかないRuboCopについて自分が現場でRuboCopの設定をした時について語っていきます。
例えばどんな感じで修正してくれるのか
実務のコードは出せないのでChatGPTに代わりに出してもらいました。
例: Layout/IndentationConsistency
以下が指摘が入ったコードです。
class ExampleClass
def example_method
puts "Hello, world!"
end
end
RuboCopの指摘: "Layout/IndentationConsistency: Inconsistent indentation detected."
RuboCopが自動修正します。
class ExampleClass
def example_method
puts "Hello, world!"
end
end
インデントで指摘があり、RuboCopが適切なインデントに修正しました。
Gemfileに追加してbundle installをする
Gemfileに以下の内容を追記しました。
group :development do
# 中略
gem 'rubocop', require: false
gem 'rubocop-performance', require: false
gem 'rubocop-rails', require: false
end
3つのgemをインストールします!。
RuboCopは開発環境でしか使わないのでdevelopmentグループの中に、
毎回requireする必要が無いのでrequire: falseにします。この後に以下を実行します。
bundle install
現場でbundle installする時の注意点
現場でapiのコンテナに入っていない状態でbundle installした後にrubocopを起動したり
したらなんとファイルが5000ファイル以上も変更されてました。
dockerの環境にちゃんと入ってからbundle installした方がいいですね汗。
RSpecも導入するなら
RSpecも導入するならGemfileにRSpec関連のGemも追記しておくといいです。
group :development, :test do
#中略
gem "factory_bot_rails"
gem "rspec-rails"
end
RSpecでテストをする際にFactoryBotも入れておくと便利です。
後、これだと
bundle exec rubocop
が実行できません。
rubocop
だけのコマンドは実行できます。Gemfileに以下の追記が必要です。
group :development do
# 中略
gem 'rubocop-rspec', require: false
end
bundle exec rubocop --auto-gen-configコマンドを使って初期設定
以下のコマンドで初期設定ができます。
bundle exec rubocop --auto-gen-config
このコマンドが実行後に以下の2つのファイルができます。
.rubocop.yml
.rubocop_todo.yml
今コマンドを打った
bundle exec rubocop --auto-gen-config
は 今ルール違反のあるファイルや内容をすべて.rubocop_todo.ymlに書け! というコマンドです。
.rubocop.ymlについて
これはルールの設定を細かく設定できるファイルのことです。
まずは以下を追記します。
inherit_from: .rubocop_todo.yml #rubocop_todo.ymlに書いてある内容はルール違反してても無視
require:
- rubocop-performance #ここはGemfileで設定した部分
- rubocop-rails
- rubocop-rspec
.rubocop_todo.yml
先ほどの
$ bundle exec rubocop –auto-gen-config
コマンドでルール違反が起きている内容はここに書いてあります。
参考資料を引用すると
RuboCopを導入する際はこのコマンドを打ち込んで一旦エラーが無い状態にします。その上で少しづづ.rubocop_todo.ymlの内容を削除して最終的に空のファイルにすることを目指します
細かい解析はChatGPTや以下の記事で調べてください。
.rubocop.ymlにルールを記載
自分が実際に実装したものは公開できないので
参考資料から引用します。
inherit_from: .rubocop_todo.yml
require:
- rubocop-performance
- rubocop-rails
AllCops:
SuggestExtensions: false
# 最新のルールを適用する
NewCops: enable
# 何のルールに引っかかったか表示する
DisplayCopNames: true
# rubocop対象外(リポジトリ毎で調節)
Exclude:
- "Gemfile"
- "bin/**/*"
- "db/**/*"
- "log/**/*"
- "tmp/**/*"
- "vendor/**/*"
- "lib/tasks/auto_annotate_models.rake"
- "config/environments/*"
- "config/puma.rb"
### ルールのカスタマイズ
# 設定が厳しいので一旦全てfalseにする
Metrics:
Enabled: false
# 一行あたりの文字数
Layout/LineLength:
Enabled: false
# メソッドの改行ルール
Layout/MultilineMethodCallIndentation:
EnforcedStyle: indented
# 日本語にコメントを許可
Style/AsciiComments:
Enabled: false
# クラスにコメントを残さなくても良い
Style/Documentation:
Enabled: false
# コントローラ等のモジュールをネストしての宣言
Style/ClassAndModuleChildren:
Enabled: false
# 文字列のfreeze(Ruby3からは自動でfreezeされるので要らない)
Style/FrozenStringLiteralComment:
Enabled: false
# ガード節の提案(難しいので一旦false)
Style/GuardClause:
Enabled: false
# 文字列のダブルクォートチェック
Style/StringLiterals:
Enabled: false
# シンボルによる配列の%記法のチェック
Style/SymbolArray:
Enabled: false
# EnforcedStyle: brackets
# 文字列による配列の%記法のチェック
Style/WordArray:
Enabled: false
# 変数名に数字を許可
Naming/VariableNumber:
Enabled: false
# = と == の指摘
Lint/AssignmentInCondition:
Enabled: false
# メソッド名等の命名の指摘
Naming/PredicateName:
Enabled: false
# 未i18nのチェック(バリデーションエラーメッセージをi18nに登録するのはやや冗長?なためfalse)
Rails/I18nLocaleTexts:
Enabled: false
# before_actionの際の未定義メソッドのチェック(deviseとの兼ね合いで一旦false)
Rails/LexicallyScopedActionFilter:
Enabled: false
⚫︎AllCops:
全てのルールへの全体的な設定についてです。
⚫︎Exclude
RuboCopの検出対象から外すファイルです。
.rubocop_todo.yml削除
.rubocop.ymlの設定が終われば.rubocop_todo.ymlを削除しました。
RuboCopを起動
実際にRuboCopを起動します。
bundle exec rubocop
すると
みたいな感じになります。
これは51のファイルチェックして220個ルール違反が検出されたということです。
bundle exec rubocop -a
で自動修正してくれるみたいです。
有益な記事
参考資料
公式ドキュメント
RuboCopを実行していく上で参考にしてください。
Discussion