iT邦幫忙

2021 iThome 鐵人賽

DAY 2
0
自我挑戰組

冒險村-30 Day Ruby on Rails Tips Challenge系列 第 2

冒險村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

  # Gemfile
  group :development, :test do
    gem "rubocop", require: false
  end

Usage

  # At the root directory of a Rails app
  bundle exec rubocop

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

Code style checker

  # 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

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

Modify with suggest

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

  # 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

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

  bundle exec rubocop --auto-gen-config

Setting Rule

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

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

  # .rubocop.yml

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

改為 doueble_quotes 的規範

  # .rubocop.yml

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

Exclude file

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

  # .rubocop.yml

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

Auto fix

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

  # 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,詳細就不多贅述了!

  # .rubocop.yml
  require:
    - rubocop-performance
    - rubocop-rails

RubyGems

參考來源

My blog


上一篇
冒險村01 - Begin from linter(1)
下一篇
冒險村03 - Travis CI cookbook
系列文
冒險村-30 Day Ruby on Rails Tips Challenge30

尚未有邦友留言

立即登入留言