延續上篇的 rails_best_practices 後,這篇來介紹 linter Rubocop
Rubocop 是一個可以統一規定、自訂規則及忽略規則,達到完全的客製化的 linter,把團隊的開發 coding style 都遵循在這個基石上繼續建立,可以提升專案開發效率。
如果專案沒有一個基本的規範,在工程師的協作中,想必一定常常遇到該寫單引號還是雙引號(戰)?註解該寫中文還是英文、TODO 該怎麼註釋?括號怎麼斷行、def 的寫法、程式行數限制是否該重構寫法?該如何斷行?等等的情況。
廢話不多說,直接來看要怎麼使用這個強大的 linter 吧!
註:除了使用 rubocop 官方 的規範外,也可以參考 Github、Shopify 等各家的 Ruby Style Guide 來使用,這部分就要看團隊討論決定。
# Gemfile
group :development, :test do
gem "rubocop", require: false
end
# At the root directory of a Rails app
bundle exec rubocop
# for specific filename
bundle exec rubocop app/models/users.rb
# app/models/users.rb
class User < ApplicationRecord
has_many :posts
end
透過 rubocop 執行檢查一下檔案是否符合規範!
Inspecting 1 file
C
Offenses:
app/models/user.rb:1:1: C: [Correctable] Style/FrozenStringLiteralComment: Missing frozen string literal comment.
class User < ApplicationRecord
^
1 file inspected, 1 offense detected, 1 offense auto-correctable
Tip: Based on detected gems, the following RuboCop extension libraries might be helpful:
* rubocop-rails (https://github.com/rubocop/rubocop-rails)
You can opt out of this message by adding the following to your config (see https://docs.rubocop.org/rubocop/extensions.html#extension-suggestions for more options):
AllCops:
SuggestExtensions: false
從錯誤的訊息中可以看到不符合規定的程式碼,不只告訴偵測檔案的數量、哪ㄧ行、錯誤的原因,以及修改的建議。
# frozen_string_literal: true
class User < ApplicationRecord
has_many :posts
end
# bundle exec rubocop app/models/user.rb
# 1 file inspected, no offenses detected
產生規則以及需要待修改的檔案
bundle exec rubocop --auto-gen-config
前面提到的單引號、雙引號的使用,也是滿常需要規範的部分,不然有時候找 string 搜尋真的挺不方便,default 開啟預設為 single_quotes
但也可以直接選擇不開啟,不管三七二十一隨便都用
# .rubocop.yml
#################### Style ####################
Style/StringLiterals:
Enabled: false
改為 doueble_quotes
的規範
# .rubocop.yml
#################### Style ####################
Style/StringLiterals:
Enabled: true
EnforcedStyle: double_quotes
可以將特定的檔案,不受到 rubocop 的偵測,將檔案排除在這個規則下的限制
# .rubocop.yml
Metrics:
Exclude:
- '.git/**/*'
- 'db/*.rb'
# Exclude for specific file
- 'app/models/user.rb'
如前面的例子,不想要排除原本的規則,但又想要自動產生 frozen_string_literal
在每個檔案前該怎麼做?(以前專案還不習慣的時候常常用,因為都忘記加,但後來每次新增的時候就習慣先去 copy 過來,後來也就很少用了)
# At the root directory of a Rails app
bundle exec rubocop --auto-correct --only Style/FrozenStringLiteralComment
最後,如果有些 file 真的不想修或者是以前有些人都沒好好照規範,中間才把 cop 規範起來,然後有一堆要重新修改又懶得改的話,不妨就通通先放在 todo 等人來修正吧(誤
可以透過 extension 先安裝 ruby-rubocop
外掛,在編輯檔案時就可以先知道哪行程式碼不符合規範(外掛會在編輯器程式碼中下方標示小蝌蚪),可以省去跑指令才會出現錯誤,不過都要等存檔後一陣子才會出現!
https://marketplace.visualstudio.com/items?itemName=misogi.ruby-rubocop
另外如果關於 code performance checks & enforcing Rails best practices and coding conventions 也可以基於 rubocop 再加入 rubocop-performance
& rubocop-rails
,詳細就不多贅述了!
# .rubocop.yml
require:
- rubocop-performance
- rubocop-rails