RuboCop - An awesome Ruby code style checker
Bài đăng này đã không được cập nhật trong 3 năm
Khi làm việc trong một dự án về Ruby, nếu bạn là người review code của những thành viên khác trong team, hẳn sẽ mất khá nhiều thời gian để tìm và phát hiện ra những lỗi liên quan đến coding convention
của dự án đó nhỉ. Những lúc đó, chắc hẳn bạn đã rất cần đến một công cụ hỗ trợ việc kiểm tra tự động những lỗi convention
mắc phải phải không? (cuoideu). Vậy thì bạn đã tìm được câu trả lời ở bài viết này rồi đó, đó chính là RuboCop
.
Rubocop
Rubocop là một công cụ để phân tích và so sánh code Ruby với một số quy tắc đã được định nghĩa sẵn (Các quy tắc của RuboCop thường được gọi là "cops"
).
Rubocop được xây dựng để phục vụ cho các Ruby developer (dance3). Các quy tắc trong RuboCop có thể được enable
hoặc disable
tùy ý. Ta cũng có thể tùy chỉnh các quy tắc trong RuboCop để có thể thực thi những chuẩn riêng ứng với từng dự án Ruby.
Sử dụng RuboCop sẽ giúp chúng ta tạo ra những dòng code Ruby tốt hơn:
- Đánh giá được code của bạn với các số liệu như
độ dài của dòng
,kích thước hàm
. - Giúp cho các thành viên trong cùng một dự án tạo ra được cấu trúc code tương tự nhau.
- Thiết lập được sự thống nhất trong source code.
Cài đặt
Để cài đặt, bạn có thể gõ lệnh sau từ terminal:
$ gem install rubocop
hoặc thêm gem sau vào Gemfile
, sau đó chạy lệnh Bundle
:
gem 'rubocop', require: false
Cách sử dụng
Chạy lệnh rubocop
không có đối số sẽ kiểm tra tất cả các file Ruby trong thư mục hiện tại.
$ rubocop
Hoặc bạn có thể kiểm tra một danh sách các file và các thư mục như sau:
$ rubocop app spec lib/something.rb
Ví dụ, tôi có một đoạn code Ruby sau:
# test.rb
def badName
if something
test
end
end
Sau khi chạy lệnh rubocop test.rb
, kết quả kiểm tra code sẽ được như sau:
Inspecting 1 file
W
Offenses:
test.rb:1:5: C: Use snake_case for method names.
def badName
^^^^^^^
test.rb:2:3: C: Use a guard clause instead of wrapping the code inside a conditional expression.
if something
^^
test.rb:2:3: C: Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||.
if something
^^
test.rb:4:5: W: end at 4, 4 is not aligned with if at 2, 2
end
^^^
1 file inspected, 4 offenses detected
Phân tích lỗi convention:
- Tên method phải dưới dạng
snake_case
, ví dụ good_name - Sử dụng
guard clause
thay thế choconditional expression
:
def badName
return unless something
test
end
- Hoặc, nên viết câu điều kiện như sau khi chỉ có 1 dòng đơn:
def badName
test if something
end
end
ở dòng 4 không cùng lề vớiif
ở dòng 2
Symbols
Các symbol sau xuất hiện trong Output ở trên dùng để chỉ những kết quả đánh giá như sau:
Symbol | Mô tả |
---|---|
. |
File không có bất cứ vấn đề nào |
C |
File có một vấn đề liên quan đến convention |
E |
File có chứa một error |
F |
File có chứa một fatal error |
W |
File có chứa một warning |
Ví dụ đơn giản ở trên đã cho thấy, chúng ta đã có thể dễ dàng và nhanh chóng phát hiện ra lỗi convention
mà chúng ta đã sơ ý mắc phải với RuboCop
đúng ko nào (cuoideu).
Để biết thêm về những options của lệnh rubocop, bạn có thể gõ:
$ rubocop -h
Hầu hết tất cả các cops
trong RuboCop đều dựa trên Ruby Style Guide. Nhiều cops
có cấu hình tùy chọn, cho phép chúng hỗ trợ các coding convention
phổ biến khác nhau. Để thay đổi giá trị mặc định của các cops
, ta có thể tùy chỉnh ở trong .rubocop.yml
. Sử dụng .rubocop.yml
, ta có thể override các giá trị mặc định của các cop
thành enable
hoặc disable
.
Cú pháp
Một file .rubocop.yml
có cấu trúc như sau:
NAME_OF_RULE:
Description: 'a description of a rule'
Enabled : (true or false)
KEY: VALUE
trong đó:
NAME_OF_RULE
là tên của mộtcop
Enabled
dùng để kích hoạt (true) hoặc vô hiệu quá (false) mộtcop
mặc định.KEY: VALUE
dùng để thêm thông tin chi tiết về mộtcop
nào đó. Ví dụMax: 100
để thiết lập độ dài của một dòng với 100 ký tự.
Một ví dụ về .rubocop.yml
được sử dụng trong dự án tôi đang làm như sau:
# Maximum line length
LineLength:
Max: 100
Encoding:
Enabled: false
TrailingComma:
Enabled: false
# Maximum method length
MethodLength:
Max: 20
Các cài đặt đó đã disable
2 cop
mà đúng ra nó là enable
trong RuboCop ở chế độ mặc định, đó là: Encoding
, TrailingComma
và nó đã thay đổi giá trị LineLength
và MethodLength
lần lượt thành 100 ký tự và 20 ký tự.
Để biết rõ hơn về các cops
khác, bạn có thể tham khảo thêm tại đây Cops (yeah).
Trên đây, tôi đã trình bày sơ qua về tính năng cũng như cách sử dụng của một công cụ hỗ trợ kiểm tra coding convention
tự động rất hiệu quả, hi vọng nó đã giúp ích được cho bạn đọc (yeah).
Tài liệu tham khảo
All rights reserved