Rails newした後Rubocopでやること色々

Rubocopって何?

bbatsov/rubocop

  • Rubyの静的コード解析器
  • ruby-style-guideを遵守させる
  • 問題点について自動的に修正してくれる

Rubocop入れると何が良いの?

  • ruby-style-guideという標準的なコーディングスタイルガイドにコードが準拠する
    • 可読性up
    • 不穏なコードが減る結果、バグの元が減る
  • コーディング規約を設定ファイルにできる
  • コーディング規約違反を自動的に検出/修正できる -新規メンバーが入った時に、そのプロジェクトのコーディングスタイルに合わせることが容易

特に初心者に有用という意見が多い

インストール

# Gemfile
gem 'rubocop', require: false

使い方

$ bundle exec rubocop

設定ファイル

カレントディレクトリに.rubocop.ymlを用意する

#.rubocop.yml
AllCops:
  RunRailsCops: true # Rails向けのチェックも行う

自動生成されたコードに文句を言われる!

色々調整する必要がある

  • RailsとrubocopにPRを投げるべき問題のような気がしないでもない

チェック対象外ファイルの設定

RubocopのREADMEに、Railsの場合、以下のように設定するよう書いてある

#.rubocop.yml
AllCops:
  RunRailsCops: true
  Include:
    - '**/Rakefile'
    - '**/config.ru'
  Exclude:
    - 'db/**/*'
    - 'config/**/*'
    - 'script/**/*'
    - 'bundle_bin/*'
    - 'bin/*'
    - !ruby/regexp /old_and_unused\.rb$/

まだ文句言われるよ?

多分Rails4に対応しきれてない & 自分の場合、bundle_bin に実行ファイルを置いているので、更に /bin, /bundle_bin を対象外とする

AllCops:
  RunRailsCops: true
  Include:
    - '**/Rakefile'
    - '**/config.ru'
  Exclude:
    - 'db/**/*'
    - 'config/**/*'
    - 'script/**/*'
    - 'bundle_bin/*'
    - 'bin/*'

まだまだ文句言われるよ?

既存のプロジェクトにとりあえず入れた時にうんざりしないように、現状の問題をTODOファイルに入れて一旦無視するオプション、--auto-gen-config を使う

  • 個人的な感想: 神オプション! こういうのがあると無いとで、導入の敷居が激しく変わると思う
$ bundle exec rubocop --auto-gen-config

既存の問題点が.rubocop_todo.ymlに格納されるので、それを.rubocop.ymlにincludeする

inherit_from: .rubocop_todo.yml
AllCops:
  RunRailsCops: true
  Include:
    - '**/Rakefile'
    - '**/config.ru'
  Exclude:
    - 'db/**/*'
    - 'config/**/*'
    - 'script/**/*'
    - 'bundle_bin/*'
    - 'bin/*'
    - !ruby/regexp /old_and_unused\.rb$/

.rubocop_todo.yml の微調整

注意: rspecを入れている場合

そのままだと、変数展開のない文字列にダブルクォーテーションを許可する設定になってしまうので、そこだけ消す

Style/StringLiterals:
  Enabled: false

問題点の自動修正

--auto-correct オプションで、一部の問題点については自動的に修正してくれる

$ rubocop --auto-correct

これで、spec/rails_helper.rb のダブルクォーテーションが、シングルクォーテーションに修正されるので、まとめてcommitする

Rspecに対応させる

nevir/rubocop-rspec

# Gemfile
gem 'rubocop-rspec'
# .rubocop.yml
require: rubocop-rspec

実行方法

$ rubocop --require rubocop-rspec

日本語のコメントがエラーになるよ...

以下を設定する

AsciiComments:
  Enabled: false

感想

  • 厳密にやり過ぎると多分長く続かないので、メンバー間で合意を取って必要なものだけ取捨選択していけば良い
    • いろいろ試してみて良い位置に行くのが良い気がする
  • 多分だけど、CIに組み込んで通らなかったらマージできないレベルで厳しくすると色々大変
  • けど、やった方がコードの品質は安定するはず
  • そういう意味で取り扱いが難しいツール
  • いろんなところに、「ウチはこうしている」という設定が上がっているので参考にするのが良い

参考