12/08/2018, 18:02

Ruby CI - Phần một: "Quan trọng là phong cách" - said Rubocop, Ruby Style Officer

Giới thiệu Ở bài đầu tiên, mình xin được giới thiệu về Rubocop bởi tính phổ cập và độ quan trọng của nó, đây cũng là phần tương đối dễ để chọn làm bước khởi động trong quá trình khám phá bộ tứ CI mà mình đã giới thiệu ở phần mô tả của serie này. Rubocop là công cụ phân tích code tĩnh, ...

Giới thiệu

Ở bài đầu tiên, mình xin được giới thiệu về Rubocop bởi tính phổ cập và độ quan trọng của nó, đây cũng là phần tương đối dễ để chọn làm bước khởi động trong quá trình khám phá bộ tứ CI mà mình đã giới thiệu ở phần mô tả của serie này.

Rubocop là công cụ phân tích code tĩnh, được dùng để kiểm tra code style. Nó được xây dựng dựa trên bộ khung các chuẩn code style đến từ cộng đồng Ruby Style Guide nhằm mang đến lợi ích cho developers trong những dự án phát triển áp dụng CI, thông qua việc phân tích và báo cáo các lỗi về "phong cách" mà người lập trình mắc phải trong mã nguồn. Việc sử dụng Rubocop đem lại cho ta bốn lợi ích chính sau:

  1. Dễ dàng phát hiện và thông báo các lỗi vi phạm coding convention
  2. Tạo ra sự chuẩn hóa và tính đồng bộ của mã nguồn
  3. Giúp người lập trình có xu hướng viết code sạch và dễ đọc, tăng hiệu quả và tiết kiệm thời gian cho dự án
  4. Các quy tắc về convention dễ dàng được tùy chỉnh để phù hợp với quy tắc riêng của từng dự án hay đối với từng công ty

Cài đặt

Các bước cài đặt của Rubocop là khá cơ bản.

  • Sử dụng bundler :gem 'rubocop' sau đó chạy $ bundle

  • Hoặc dùng gem install với:

    $ gem install rubocop

Cơ bản về cách dùng

Cách dễ nhất là chạy lệnh rubocop không có tham số để kiểm tra toàn bộ files nguồn trong thư mục hiện tại:

$ rubocop

Ta cũng có thể truyền vào phía sau rubocop một danh sách các files và thư mục cụ thể để kiểm tra:

$ rubocop app spec lib/something.rb

Dưới đây là ví dụ về cách nó hoạt động, quan sát đoạn code dưới đây:

def badName
  if something
    test
    end
end

Kiểm tra Rubocop trên đoạn code này, giả sử tên file là test.rb, bằng lệnh:

$ rubocop test.rb

một nội dung báo cáo được sinh ra như sau:

Inspecting 1 file
W

Offenses:

test.rb:1:1: C: Style/FrozenStringLiteralComment: Missing magic comment # frozen_string_literal: true.
def badName
^
test.rb:1:5: C: Naming/MethodName: Use snake_case for method names.
def badName
    ^^^^^^^
test.rb:2:3: C: Style/GuardClause: Use a guard clause instead of wrapping the code inside a conditional expression.
  if something
  ^^
test.rb:2:3: C: Style/IfUnlessModifier: 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: Layout/EndAlignment: end at 4, 4 is not aligned with if at 2, 2.
    end
    ^^^

1 file inspected, 5 offenses detected

Để có thể biết thêm chi tiết hơn về các tùy chọn đối với kiểm tra rubocop trên dòng lệnh, hãy sử dụng:

$ rubocop -h

Nếu bạn cảm thấy lạ lẫm, đừng lo lắng vì phần sau sẽ giúp bạn hiểu ra được nhiều điều.

Có rất nhiều tùy chọn mà bạn có thể sử dụng kèm theo với command line, ở đây mình xin phép chỉ giới thiệu một vài options cơ bản mà mình hay dùng.

rubocop --require rubocop/formatter/checkstyle_formatter --format RuboCop::Formatter::CheckstyleFormatter --no-color --rails --out .framgia-ci-reports/rubocop.xml app/ lib/

Trong đó:

  • -r/--require: require Ruby file (dùng cho Loading Extensions), ở đây là require rubocop/formatter/checkstyle_formatter extension
  • -f/--format: chọn một bộ định dạng, ở đây bộ định dạng chính là RuboCop::Formatter::CheckstyleFormatter
  • --[no-]color: quy định kết quả trả về có sử dụng màu sắc để highlight hay không
  • -R/--rails: chạy kèm các cops của Rails
  • --out: ghi kết quả ra file chỉ định thay vì STDOUT, ở đây lưu vào framgia-ci-reports/rubocop.xml

Exit code

Rubocop sau mỗi lần kết thúc kiểm tra sẽ trả về kèm theo một trong ba mã trạng thái sau:

  • 0: nếu như không phát hiện vi phạm nào, hoặc mức độ vi phạm nhỏ hơn mức quy định bởi --fail-level option
  • 1: nếu như một hoặc nhiều vi phạm xảy ra (nhiều hơn mức định nghĩa bởi --fail-level)
  • 2: nếu như Rubocop bị dừng một cách bất thường xảy ra do những thiết lập không hợp lệ, các tùy chọn trên Comand Line bị sai hay các lỗi cục bộ

Cops

Cops trong tiếng lóng của người bản xứ ám chỉ cớm             </div>
            
            <div class=

0