Sử dụng gem Rubocop trong Rails

Tram Ho

Mở đầu

Rubocop là một công cụ để kiểm tra code style dựa trên ruby-style-guide, xây dựng lên để nhằm phục vụ cho các Ruby developer.
Rubocop sử dụng những quy tắc được định sẵn để so sánh chúng với code của bạn rồi đưa ra các thông báo lỗi. Ta dễ dàng nhận thấy những lợi ích khi sử dụng Rubocop dưới đây:

  • Đánh giá được source của dự án như là độ dài tối đa của lines, method, class,…
  • Kiểm tra dễ dàng các lỗi về coding convention, tiết kiệm thời gian cho người review
  • Tạo sự đồng bộ về source code của dự án

Cài đặt

Để cài đặt bạn có thể gõ lệnh sau trên terminal:

Hoặc bạn có thể thêm dòng sau vào Gemfile rồi chạy lệnh bundle install:

Cách sử dụng

  • Chạy tất cả thư mục:
  • Chạy riêng một thư mục:
  • Chạy riêng 1 file:
  • Chạy động thời các thư mục và các file khác nhau:

Cấu hình

Về cơ bản việc cài đặt như trên đã đủ để chúng ta dùng gem này rồi. Tuy nhiên tùy từng dự án, từng công ty mà các quy tắc code của chúng ta sẽ khác nhau do vậy rubocop không cố định hoàn toàn các quy tắc lỗi. Chúng ta hoàn toàn có thể chỉnh sửa config để rubocop bắt lỗi theo đúng những gì bạn muốn. Bạn có thể sửa trong file .rubocop.yml, lúc này nó sẽ ghi đè lên các cops( các quy tắc kiểm tra) mặc định tương ứng của nó.

Format của .rubocop.yml có dạng:

  • Inheritance

    Rubocop hỗ trợ kế thừa các config từ một hoặc nhiều tập tin config khác nhau. Tùy chọn inherit_from có thể được sử dụng để include config từ một hoặc nhiều file. Điều khiển cho nó có thể có những setting chung giữa các project trong một file .rubocop.yml gốc nào đó và sau đó có thể tùy chỉnh ở các file, thư mục con. Ví dụ sau ta có 2 file .rubocop_enabled.yml và .rubocop_disabled.yml được include vào file .rubocop.yml

  • Including/Excluding files

    Include: chỉ check cops trong những file khai báo:

    Exclude: check cops ngoại trừ các file khai báo

  • Cú pháp của một cops như sau:

    Trong đó:

    • rule_name: là tên của một cop
    • Description: mô tả cop
    • Enabled: dùng để kích hoạt (true) hoặc vô hiệu hóa (false) một cop, thông thường theo mặc định sẽ là true
    • Key, value: dùng để thêm thông tin cho 1 cop nào đó, ví dụ như các giá trị Max cho độ dài dòng, của phương thức, của class,…

Ví dụ: Tôi có một đoạn code ruby sau

Sau khi chạy lệnh rubocop app/controllers/tests_controller.rb, kết quả ta có được như sau:

Như trên ta thấy rubocop đã thông báo 5 lỗi về convention, ta phân tich các lỗi như sau:

  • Đối với 2 lỗi là Style/Documentation: Missing top-level class documentation comment, Style/FrozenStringLiteralComment: Missing magic comment # frozen_string_literal: true theo cá nhân mình thấy thì n thực sự không quá là quan trọng nên chúng ta có thể disable nó đi trong file config như sau:
  • Use snake_case for method names lỗi này là tên phương thức phải dưới dạng snake_case, trong ví dụ trên ta sửa như sau: badName => bad_name
  • Use def with parentheses when there are parameters: định nghĩa phương thức có các tham số thì phải có dấu ngoặc đơn, trong ví dụ sửa như sau: bad_name(name)
  • Layout/IndentationWidth: Use 2 (not 0) spaces for indentation: khi xuống dòng phải lùi vào 2 space

Đoạn code hoàn chỉnh sẽ như sau:

Bạn có thể tham khảo thêm 1 số cops ở đây: ruby-style-guide

  • Một số symbols có thể xuất hiện trong output như sau:
SymbolMô tả
.File không có bất cứ vấn đề gì
CFile có chứa vấn đề liên quan đến convention
EFile có chứa một error
FFile có chứa một fata error
WFile có chưa warning

Tổng kết

Bài viết có tham khảo:

https://github.com/rubocop-hq/rubocop/blob/master/manual/configuration.md

https://github.com/rubocop-hq/rubocop

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo