Tìm hiểu về gem rubocop trong rails
RUBOCOP là gì? Rubocop là một công cụ để kiểm tra code style dựa trên ruby-style-guide, được xây dựng phục vụ cho developers. Rubocop sử dụng các 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. Sử dụng Rubocop trong projects giúp chúng ta tiết kiệm thời ...
RUBOCOP là gì?
Rubocop là một công cụ để kiểm tra code style dựa trên ruby-style-guide, được xây dựng phục vụ cho developers.
Rubocop sử dụng các 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.
Sử dụng Rubocop trong projects giúp chúng ta tiết kiệm thời gian cho việc review coding convention và đảm bảo code không mắc phải những lỗi convention cơ bản.
1. Setup rubocop
Cách 1: Cho vào Gemfile và bundle install
gem 'rubocop', require: false
Cách 2: Có thể chạy trực tiếp trên terminal
gem install rubocop
2. Basic Usage
//chạy rubocop không đối số để kiểm tra tất cả các file Ruby ở trong thư mục hiện tại. rubocop //chạy riêng 1 thư mục rubocop app/ //Chạy riêng 1 file rubocop app/models/user.rb //hoặc có thể chạy đồng thời các thư mục và các file khác nhau rubocop app/models/user.rb app/controllers/ app/views/test/index.rb
Ví dụ: Có một trang view hiển thị thông tin của product như sau:
<p id="notice"><%= notice %></p> <p> <strong>Name:</strong> <%= @product.name %> </p> <p> <strong>Price:</strong> <%= @product.price %> </p> <p> <%= link_to 'Edit', edit_product_path(@product) %> | <%= link_to 'Back', products_path %>
Sau đó, trên terminal chạy dòng lệnh sau
rubocop_demo rubocop app/views/products/show.html.erb
Và được kết qủa là:
app/views/products/show.html.erb:1:1: E: unexpected token tLT (Using Ruby 2.0 parser; configure using TargetRubyVersion parameter, under AllCops) <p id="notice"><%= notice %></p> ^ app/views/products/show.html.erb:1:16: E: unexpected token tLT (Using Ruby 2.0 parser; configure using TargetRubyVersion parameter, under AllCops) <p id="notice"><%= notice %></p> ^ app/views/products/show.html.erb:4:5: E: unexpected token tIVAR (Using Ruby 2.0 parser; configure using TargetRubyVersion parameter, under AllCops) <%= @product.name %> ^^^^^^^^ app/views/products/show.html.erb:6:1: E: unexpected token tLT (Using Ruby 2.0 parser; configure using TargetRubyVersion parameter, under AllCops) <p> ^ app/views/products/show.html.erb:9:3: E: unknown regexp options: p (Using Ruby 2.0 parser; configure using TargetRubyVersion parameter, under AllCops) </p> ^ app/views/products/show.html.erb:10:1: E: unexpected token tLT (Using Ruby 2.0 parser; configure using TargetRubyVersion parameter, under AllCops) <p> ^ app/views/products/show.html.erb:11:58: E: unexpected token tIDENTIFIER (Using Ruby 2.0 parser; configure using TargetRubyVersion parameter, under AllCops) <%= link_to 'Edit', edit_product_path(@product) %> | <%= link_to 'Back', products_path %> ^^^^^^^ app/views/products/show.html.erb:11:88: F: unterminated string meets end of file (Using Ruby 2.0 parser; configure using TargetRubyVersion parameter, under AllCops) <%= link_to 'Edit', edit_product_path(@product) %> | <%= link_to 'Back', products_path %> ^ 1 file inspected, 8 offenses detected
Với thông báo như vậy bạn sẽ dễ dàng phát hiện và sửa chữa lỗi ngay tức thì.
3. Cops
Là các nguyên tắc kiểm tra khác nhau được thực hiện trên các mã code. Và bạn có thể tùy biến cops. Cops bao gồm:
Style
Hầu hết cops trong RuboCop được gọi là style cop, và để kiểm tra những vấn đề về stylist trong code của bạn. Đa phần chúng đều dựa trên Ruby Style Guide. Nhiều style cops có các lựa chọn configurations cho phép chúng hỗ trợ nhiều coding convention khác nhau.
Lint
Kiểm tra các lỗi có thể xảy ra trong code có thể chạy lint cop như sau:
rubocop -l
lựa chọn l/--lintcó thể được dùng cùng với --only để chạy tất cả những lint cop có sẵn cùng với một lựa chọn từ cop khác. Disable bất kì lint cop nào đó là một ý tưởng tồi.
Metrics
Đề cập đến những properties của source code, dùng để thống kê, đo lường chẳng hạn như: chiều dài lớp, chiều dài phương thức... Nói chung, Metrics sẽ có 1 tham số cấu hình gọi là Max và sẽ được set cho gía trị cao nhất khi chạy lệnh sau:
rubocop --auto-gen-config
Performance
Rails
Rails cops đặc trưng riêng cho Ruby on Rails framework. Nó khác với style và lint cop ở chỗ không được sử dụng mặc định mà chúng ta cần phải yêu cầu cụ thể như sau:
rubocop -R
Hoặc, có thể thêm vào trực tiếp ngay trong file .rubocop.yml ở trong ứng dụng của bạn:
Rails: Enabled: true
4. Formatters
Bạn có thể thay đổi định dạng output của RuboCop bằng cách chỉ đinh định dạng với lựa chọn -f/--format. RuboCop có nhiều định dạng và bạn cũng có thể tùy ý tạo mới định dạng của mình.
# Định dạng đơn giản đến $stdout. $ rubocop --format simple # Định dạng tiến độ mặc định đến file result.txt. $ rubocop --out result.txt # Both progress and offense count formats to $stdout. # The offense count formatter outputs only the final summary, # so you'll mostly see the outputs from the progress formatter, # and at the end the offense count summary will be outputted. $ rubocop --format progress --format offenses # Progress format to $stdout, and JSON format to the file rubocop.json. $ rubocop --format progress --format json --out rubocop.json # ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~ # | |_______________| # $stdout # Progress format to result.txt, and simple format to $stdout. $ rubocop --output result.txt --format simple
5. Configuration
Các hành vi của RuboCop được điều khiển thông qua tập tin cấu hình .rubocop.yml. Làm cho nó có thể kích hoạt hay vô hiệu hóa các cops và thay đổi hành vi nếu nó accept bất kỳ tham số nào. RuboCop sẽ bắt đầu tìm kiếm các tập tin cấu hình trong thư mục mà tập tin được kiểm tra là và tiếp tục con đường của nó đến thư mục gốc.
Bài post được dịch và tham khảo từ: http://rubocop.readthedocs.io/en/latest/