冒險村02 - Begin from linter(2)

02 - Begin from linter : rubocop

延續上篇的 rails_best_practices 後,這篇來介紹 linter Rubocop

Rubocop 是一個可以統一規定、自訂規則及忽略規則,達到完全的客製化的 linter,把團隊的開發 coding style 都遵循在這個基石上繼續建立,可以提升專案開發效率。

如果專案沒有一個基本的規範,在工程師的協作中,想必一定常常遇到該寫單引號還是雙引號(戰)?註解該寫中文還是英文、TODO 該怎麼註釋?括號怎麼斷行、def 的寫法、程式行數限制是否該重構寫法?該如何斷行?等等的情況。

廢話不多說,直接來看要怎麼使用這個強大的 linter 吧!

註:除了使用 rubocop 官方 的規範外,也可以參考 GithubShopify 等各家的 Ruby Style Guide 來使用,這部分就要看團隊討論決定。

gem install

1
2
3
4
# Gemfile
group :development, :test do
gem "rubocop", require: false
end

Usage

1
2
3
4
5
# At the root directory of a Rails app
bundle exec rubocop

# for specific filename
bundle exec rubocop app/models/users.rb

Code style checker

1
2
3
4
# app/models/users.rb
class User < ApplicationRecord
has_many :posts
end

透過 rubocop 執行檢查一下檔案是否符合規範!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

從錯誤的訊息中可以看到不符合規定的程式碼,不只告訴偵測檔案的數量、哪ㄧ行、錯誤的原因,以及修改的建議。

Modify with suggest

Class: RuboCop::Cop::Style::FrozenStringLiteralComment

1
2
3
4
5
6
7
8
# frozen_string_literal: true

class User < ApplicationRecord
has_many :posts
end

# bundle exec rubocop app/models/user.rb
# 1 file inspected, no offenses detected

Generate config

產生規則以及需要待修改的檔案

1
bundle exec rubocop --auto-gen-config

Setting Rule

前面提到的單引號、雙引號的使用,也是滿常需要規範的部分,不然有時候找 string 搜尋真的挺不方便,default 開啟預設為 single_quotes

但也可以直接選擇不開啟,不管三七二十一隨便都用

1
2
3
4
5
# .rubocop.yml

#################### Style ####################
Style/StringLiterals:
Enabled: false

改為 doueble_quotes 的規範

1
2
3
4
5
6
# .rubocop.yml

#################### Style ####################
Style/StringLiterals:
Enabled: true
EnforcedStyle: double_quotes

Exclude file

可以將特定的檔案,不受到 rubocop 的偵測,將檔案排除在這個規則下的限制

1
2
3
4
5
6
7
8
# .rubocop.yml

Metrics:
Exclude:
- '.git/**/*'
- 'db/*.rb'
# Exclude for specific file
- 'app/models/user.rb'

Auto fix

如前面的例子,不想要排除原本的規則,但又想要自動產生 frozen_string_literal 在每個檔案前該怎麼做?(以前專案還不習慣的時候常常用,因為都忘記加,但後來每次新增的時候就習慣先去 copy 過來,後來也就很少用了)

1
2
# At the root directory of a Rails app
bundle exec rubocop --auto-correct --only Style/FrozenStringLiteralComment

最後,如果有些 file 真的不想修或者是以前有些人都沒好好照規範,中間才把 cop 規範起來,然後有一堆要重新修改又懶得改的話,不妨就通通先放在 todo 等人來修正吧(誤

Visual Studio Code Extension

可以透過 extension 先安裝 ruby-rubocop 外掛,在編輯檔案時就可以先知道哪行程式碼不符合規範(外掛會在編輯器程式碼中下方標示小蝌蚪),可以省去跑指令才會出現錯誤,不過都要等存檔後一陣子才會出現!

https://marketplace.visualstudio.com/items?itemName=misogi.ruby-rubocop

Require

另外如果關於 code performance checks & enforcing Rails best practices and coding conventions 也可以基於 rubocop 再加入 rubocop-performance & rubocop-rails,詳細就不多贅述了!

1
2
3
4
# .rubocop.yml
require:
- rubocop-performance
- rubocop-rails

RubyGems

參考來源