Sử dụng gem RuboCop trong Rails
This post hasn't been updated for 7 years
Bạn hay bị comment lỗi convention khi gửi pull cho các trainer check?
Việc này xảy ra thường xuyên đặc biệt với các bạn mới bắt đầu thực hiện các project training đầu tiên với hàng chục comment chỉ về indent, rails convention, quá dòng...Vậy làm thế nào để mình có thể check các lỗi convention đó một cách dễ dàng mà không phải mất công rò soát lại mỗi khi gửi pull lên github?
Bài viết này mình giới thiệu về gem rubocop
hỗ trợ việc check các lỗi convention trong code rails.
I. Cài đặt
Thêm vào Gemfile
:
gem 'rubocop', '~> 0.46.0', require: false
chạy bundle
để cài đặt gem.
II. Sử dụng
Trong terminal, bạn chỉ cần gõ rubocop
, Rubocop sẽ duyệt các file để kiểm tra các lỗi convention và thông báo cho chúng ta biết lỗi đó là gì và ở đâu.
ví dụ:
phanbt@phanbt-Latitude-E6420:~/workspace/framgia_pmp$ rubocop
Warning: unrecognized cop Style/DeprecatedHashMethods found in /home/phanbt/workspace/framgia_pmp/.rubocop_enabled.yml
/home/phanbt/workspace/framgia_pmp/.rubocop.yml - AllCops/Excludes was renamed to AllCops/Exclude
Warning: unrecognized cop Style/DeprecatedHashMethods found in /home/phanbt/workspace/framgia_pmp/.rubocop.yml
Inspecting 126 files
....C...............C.............................C...........................................................................
Offenses:
app/helpers/application_helper.rb:26:24: C: Ternary operators must not be nested. Prefer if or else constructs instead.
estimate != 0 ? (remaining != 0 ? "estimated" : "default") : "default"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/helpers/application_helper.rb:28:24: C: Ternary operators must not be nested. Prefer if or else constructs instead.
estimate != 0 ? (remaining != 0 ? "processed" : "default") : "assigned"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/work_performance.rb:29:81: C: Line is too long. [83/80]
scope :in_day, ->(phase, day){where phase_id: phase.id, master_sprint_id: day.id}
^^^
app/controllers/api/performances_table_controller.rb:9:81: C: Line is too long. [90/80]
render partial: "work_performances/data", locals: {phase: phase, sprint: sprint}
^^^^^^^^^^
126 files inspected, 4 offenses detected
Rubocop thông báo lỗi rất rõ ràng, dễ hiểu. Như vậy, bạn chỉ cần tìm và sửa lại các lỗi trên là được.
III. Configuration
Về cơ bản, việc cài đặt như trên là ổn để dùng gem này rồi, nhưng nếu bạn muốn chỉnh sửa các cops(nguyên tắc) theo convention riêng của mình thì phải làm thế nào?
Mọi hành vi của rubocop có thể được điều khiển trong file .rubocop.yml
. Nó có thể enable/disable các cops định nghĩa trong file.
Format của .rubocop.yml có dạng:
inherit_from: ../.rubocop.yml
Style/Encoding:
Enabled: false
Metrics/LineLength:
Max: 80
- Một số từ khóa hay dùng trong các cops:
Include
: chỉ check cops trong các file khai báo:
Rails/ScopeArgs:
Include:
- app/models/**/*.rb
Rails/Validation:
Include:
- app/models/**/*.rb
`Exclude`: check cops ngoại trừ các file khai báo:
Style/FileName:
Exclude:
- '**/Rakefile'
- '**/Gemfile'
- '**/Capfile'
Enabled
: Cài đặt trạng thái cho cops, bỏ qua cops nếu false, check cops nếu true.
Metrics/MethodLength:
Description: "Avoid methods longer than 10 lines of code."
Enabled: false
Style/EmptyLines:
Description: "Don't use several empty lines in a row."
Enabled: true
- Để biết các cops thuộc loại nào, Style hay Metrics, Rails... và tìm kiếm các rule cho convention của bạn, bạn có thể tham khảo các config của rubocop tại link sau: https://rubocop.readthedocs.io/en/latest/configuration/
Rất mong bài viết này sẽ giúp các bạn nhẹ nhàng hơn trong việc tìm và sửa các lỗi convention trong code của mình.
Thanks for read!
Link tham khảo:
https://github.com/bbatsov/rubocop/blob/master/manual/configuration.md
All Rights Reserved