あらまし:
- 背景:ソースコードに変更を加えた際に文法チェックを忘れがち
- 目的:ソースに変更を加えた際に文法チェック漏れがないようにしたい
- ゴール:RubyMineでソースコードに変更を加えたら自動的に文法チェックが走るようにする。流すだけでチェック忘れを防ぐために結果をMacの通知センタで通知する
材料
- RubyMine(IDE)
- rubocop(RubyのSyntax Checker)
- guard(ファイル変更の自動検出)
- guard-rubocop(guard + rubocopの連携)
- terminal-notifier-guard(通知センタでguardの結果を通知)
手順
1. "Save files on frame deactivation"の有効化
- RubyMine上で ⌘, or RubyMine => Preferences
- 検索窓に"save"を打ち込む
- Generalをクリックして"Save files on frame deactivation"が有効になっていることを確認する
- 無効になっている場合は"Save files on frame deactivation"にチェックを入れて有効化をする
2. rubocopとguardの導入
- Gemfileに記載してbundleからインストール
Gemfile
group :development do
gem 'rubocop'
gem 'guard'
gem 'guard-rubocop'
gem 'terminal-notifier-guard'
end
% bundle install --path vendor/bundle
3. Edit ConfigurationsにGuardの実行設定を追加
- Run => Edit Configurations...
- "+"を押して"IRB Console"を選択
- Nameに"Guard"(任意)を設定
- IRB scriptにguardへのパスを設定。パスはターミナル上からbundle exec which guardで表示されるのでそれを使う
例
% bundle exec which guard
/Users/Mahito/repos/sample/vendor/bundle/ruby/2.0.0/bin/guard
- Working Directoryに自分の作業ディレクトリのパスを設定
- Bundlerタブの"Run the script in context of the bundle"にチェックを入れて有効にする
4.Guardの初期設定
- guardの利用のために必要なGuardfileを作成するためにターミナル上からguard initを実行
% bundle exec guard init
- 作成されたGuardfileに対して設定を追加
- notification: を設定しないとrubocopが失敗した際にのみ通知される。また、falseにするとすべて通知されなくなる
Guardfile
interactor :simple
guard :rubocop, notification: true do
watch(%r{.+\.rb$})
watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
end
- デフォルトだと*.rbのファイルと.rubocop.ymlが対象なので、.rakeなどを追加する場合は以下参照
Guardfile
guard :rubocop, notification: true do
watch(%r{.+\.rb$})
watch(%r{.+\.rake$}) # 追記
watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
end
5.Guardの実行
- RubyMine上から Run => Run 'Guard'
- 以降は対象ファイルが変更されるたびにrubocopが走る
- 走った結果が通知センタで通知されて幸せ
結論
- guard-rubocop便利!
参考
- ruby on rails - Is it impossible to use Guard with RubyMine? - Stack Overflow - http://stackoverflow.com/questions/11996124/is-it-impossible-to-use-guard-with-rubymine/12000765#12000765
- guard/guard - https://github.com/guard/guard
- bbatsov/rubocop - https://github.com/bbatsov/rubocop
- yujinakayama/guard-rubocop - https://github.com/yujinakayama/guard-rubocop
- Springest/terminal-notifier-guard - https://github.com/Springest/terminal-notifier-guard