多人協作時,通常會規範 style,像是統一使用單引號、雙引號、每個方法最多不能超過幾行、每行的長度限制等
這時就需要透過 RuboCop 來進行把關
後續的文章會以此 repo 作為範例
Role models are important.
-- Officer Alex J. Murphy / RoboCop
進入官方網站便能看到這段話,由此可見風格規範的重要性
如文件所說直接在終端機輸入
gem install rubocop
接著放在 development 中,test 和 production 不需使用
或不放 Gemfile 中,只針對 CI 處理即可
可參考此 commit
# Gemfile 檔案
gem 'rubocop', '~> 0.90.0'
在專案目錄下的終端機輸入
# 檢查全部的檔案
rubocop
# 只針對特定檔案、資料夾檢查
rubocop path/to/file path/to/directory
# 範例
rubocop app/controllers/application_controller.rb
備註: 善用 tldr
可看下 rubocop
怎麼使用
可參考 Cop Documentation Style
裡面有提供各種範例的設定,可針對專案需求進行調整,
並將設定檔寫在 .rubocop.yml
中,可參考此 commit
# This is the configuration used to check the rubocop source code.
# url: https://docs.rubocop.org/rubocop/0.85/cops_style.html
AllCops:
Exclude:
- 'config/routes.rb'
- 'db/schema.rb'
TargetRubyVersion: 2.7.1
TargetRailsVersion: 6.0.3.3
Rails:
Enabled: true
Rails/UnknownEnv:
Environments:
- production
- staging
- development
- test
# modern editors and terminal fit more than 120 characters.
Metrics/LineLength:
Max: 120
# Class length is not critical to code quality
Metrics/ClassLength:
Enabled: false
# Module length is not critical to code quality
Metrics/ModuleLength:
Enabled: false
# Block length is ok to be long in DSLs like 'rspec' or 'rake'
Metrics/BlockLength:
Enabled: false
# defualt '10 line' is too strict to us, and may clutter the class
Metrics/MethodLength:
Max: 25
Metrics/AbcSize:
Max: 25
# Most Rails generated class are not doced, and not needed
Style/Documentation:
Enabled: false
# 'return' makes code more readable in some cases
Style/RedundantReturn:
Enabled: false
Style/AsciiComments:
Enabled: false
# Guard is not always good to readablity
# Note: It does not mean we don't use guard to reduce block levels
# In short methods, using guard is not necessary, e.g.
# def foo(x) | def foo(x)
# if xxx?(x) | return unless xxx?(x)
# bar(x) | bar(x)
# end | end
# end |
Style/GuardClause:
Enabled: false
# The rule expects
#
# if xxxxxx
# a_very_long_method_or_somethings_like_that......
# end
#
# to be
#
# a_very_long_method_or_somethings_like_that...... if xxxxxx
#
# It is not good looking at all.
Style/IfUnlessModifier:
Enabled: false
# # bad
# a = [1, 2,]
#
# # good
# a = [
# 1, 2,
# 3,
# ]
#
# # good
# a = [
# 1,
# 2,
# ]
Style/TrailingCommaInArrayLiteral:
EnforcedStyleForMultiline: consistent_comma
# # good
# foo(
# 1,
# 2,
# )
Style/TrailingCommaInArguments:
EnforcedStyleForMultiline: consistent_comma
# # good
# a = {
# 1,
# 2,
# }
Style/TrailingCommaInHashLiteral:
EnforcedStyleForMultiline: consistent_comma
# good
# class Foo
#
# def bar
# ...
# end
#
# end
#
# bad
# class Foo
# def bar
# ...
# end
# end
Style/ClassAndModuleChildren:
Enabled: false
# bad
# "No special symbols"
# "No string interpolation"
# "Just text"
# good
# 'No special symbols'
# 'No string interpolation'
# 'Just text'
# "Wait! What's #{this}!"
# Style/StringLiterals:
# EnforcedStyle: single_quotes (default)
改了好多檔案,逐步檢查好麻煩,有什麼方法可以只針對修改的檔案檢查就好?
在自己 Local branch 的終端機輸入以下
# 若有更好的設定方式,歡迎留言交流 :)
# 方法1
rubocop $(git diff master --name-only)
# 方法2
git diff-tree -r --no-commit-id --name-only head..origin/master | xargs rubocop
# 備註: xargs 是 Linux 指令
或不想每次發 Pull requests (簡稱: pr) 都檢查全部的檔案
備註: 安裝「pronto-rubocop」時,應該會踩到安裝失敗的雷,有相依「thor」比較舊的版本,可參考上面 pr 的解決方式
# 若有更好的設定方式,歡迎留言交流 :)
# 以 Travis CI 為例
# .travis.yml
git fetch origin master && master_sha1="$(cut -c -40<<<"$(cat .git/FETCH_HEAD)")" && pronto run -c $master_sha1 --exit-code
# 欲使用 pronto 這指令,需安裝「pronto-rubocop」
# 有安裝「pronto-rubocop」的話,這段也能直接在終端機輸入
基於某些原因,某些 code 不想被 RuboCop 檢查 (說白就是不想處理 XD
想跳過檢查的話,可參考此 commit
# 依照 RuboCop 提醒,後面 oo_xx 改成對應的內容
# rubocop:disable oo_xx
your code
# rubocop:enable oo_xx
# 範例
# rubocop:disable Style/TrailingCommaInHashLiteral
your code
# rubocop:enable Style/TrailingCommaInHashLiteral
每次都要輸入 rubocop
才知道哪些要改,好麻煩,
有沒有視覺化的工具可以協助呢?
RuboCop 真的是又愛又恨的套件,好處是讓大家風格一致,壞處是處理時挺花時間的,遇到不知怎解決的問題時,Goolge 會是你的好朋友,再不行就跳過檢查(誤
鐵人賽文章連結:https://ithelp.ithome.com.tw/articles/10240956
medium 文章連結:https://link.medium.com/fx6sSkzeW9
本文同步發布於 小菜的 Blog https://riverye.com/
備註:之後文章修改更新,以個人部落格為主