rubocopの導入


背景

最初に導入すべきですが、ほぼ一人で開発していたので、してなかった。チームの拡大で、やっぱコードがやばくなってきたので、早めに導入することを決めた。

Rubocopは何

Ruby style guideを基づいて作られたstatic code analyzerです。

導入

インストール

  • 開発環境とステージングに入れてます。最新のバージョン0.55.0を入れてます。
group :development, :staging do
  gem 'rubocop', '~> 0.55.0', require: false
end

自動修正

最初は.rubocop_todo.ymlがないと動かないようなので、touch .rubocop_todo.ymlで空っぽのファイルを生成して、
rubocop -aで自動修正できる部分を修正してもらって、コミットする。

手動修正

自動的に修正してくれない部分もあるので、rubocop --auto-config-genで.rubocop.ymlを生成する。

.rubocop.ymlはrubocopのチェックを無視する設定ファイルです。そのファイルの中に自分が修正した部分をコメントアウトして、rubocopを実行すればエラーが出るので、そのエラーメッセージを参照して修正します。

後チームの中独自のルールを入れたいときにもそこで書きましょう。

自分が使ってるものは

inherit_from: .rubocop_todo.yml

AllCops:
  Exclude:
    - db/**/*
    - tmp/**/*
    - vendor/**/*
    - lib/geohash.rb
    - lib/manager/geo.rb
    - bin/spring
  TargetRubyVersion: 2.3

# Offense count: 326
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
# URISchemes: http, https
Metrics/LineLength:
  Exclude:
    - 'Rakefile'
    - '**/*/.rake'
    - 'spec/**/*.rb'
  Max: 275

Metrics/MethodLength:
  Max: 150 # remove this after refacotr

PredicateName:
  NamePrefixBlacklist:
    - has_

MixinUsage:
  Include:
    - app/**/*.rb

Naming/UncommunicativeMethodParamName:
  MinNameLength: 1

Naming/AccessorMethodName:
  Enabled: false

Style/Documentation:
  Enabled: false

Style/AsciiComments:
  Enabled: false

# Offense count: 7
Metrics/PerceivedComplexity:
  Max: 18

# Offense count: 45
# Configuration parameters: CountComments.
Metrics/MethodLength:
  Max: 106

# Offense count: 45
# Configuration parameters: CountComments.
Metrics/MethodLength:
  Max: 109

# Offense count: 1
# Configuration parameters: CountKeywordArgs.
Metrics/ParameterLists:
  Max: 7

# Offense count: 7
Metrics/CyclomaticComplexity:
  Max: 15

# Offense count: 4
# Configuration parameters: CountComments.
Metrics/ClassLength:
  Max: 140

# Offense count: 1
# Configuration parameters: CountBlocks.
Metrics/BlockNesting:
  Max: 4

# Offense count: 40
# Configuration parameters: CountComments, ExcludedMethods.
Metrics/BlockLength:
  Max: 111

# Offense count: 53
Metrics/AbcSize:
  Max: 109

# Offense count: 1
Lint/HandleExceptions:
  Exclude:
    - 'config/unicorn.rb'

修正すべきところもまだまだあるので、やりながら、修正していきたいです。

Railsについて

rubocop -Rするとrubyだけではなく、Railsもチェックしてくれますので、これから使う予定です。

CircleCI 2.0 に入れる

version: 2
jobs:
  build:
    <<: *defaults
    steps:
      - checkout
      - run:
        name: rubocop
        command: bundle exec rubocop

開発環境とステージングにデプロイする時に走らせるようにしてます。

Rubymine

2017.1からrubymineはデフォルトにrubocopが入れてます。でも自分で設定しないと動かないです。

Code -> Inspect codeを走らせると↓の結果が出ます。

感想

プロジェクトが始めた時に入れるべきものです!

自動的に走らせて貰いたい!うるさいかなあ

参照