1. Giới thiệu về Rake Task trong Rails
Ruby on Rails sử dụng Rake để quản lý các tác vụ, mà bạn có thể xem chúng như các lệnh để điều khiển ứng dụng Rails của mình. Ví dụ về các tác vụ mà Rails hỗ trợ bao gồm `rake db:migrate`, `rake db:create`, `rake db:seed`, và nhiều tác vụ khác. Tuy nhiên, bạn cũng có khả năng tự tạo các tác vụ riêng cho dự án của mình.
Bài viết này sẽ hướng dẫn cách tạo một Rake Task để quản lý WEBrick Server trong Rails, bao gồm các tác vụ để khởi động (start), dừng (stop), và khởi động lại (restart) WEBrick Server.
2. Tạo và quản lý Rake Task
2.1. Cú pháp tạo Rake Task
Trong Rails 5, bạn có khả năng nhóm nhiều Task lại với nhau trong một Namespace. Để tạo các Task trong Namespace, bạn có thể sử dụng lệnh sau để tạo:
“`
rails g task my_namespace my_task1 my_task2
“`
Kết quả của lệnh này sẽ tạo ra một tệp tin có tên là `my_namespace.rake` trong thư mục `app/lib/tasks`. Tệp này sẽ chứa hai Task là `my_task1` và `my_task2`.
Sau khi tạo các Task trong Namespace, bạn có thể thực thi chúng bằng cách sử dụng lệnh sau:
“`
bin/rake my_namespace:my_task1
bin/rake my_namespace:my_task2
“`
Tuy nhiên, trong Rails 5, bạn cũng có thể sử dụng lệnh `rails` thay vì `bin/rake` như sau:
“`
rails my_namespace:my_task1
rails my_namespace:my_task2
“`
Điều này giúp bạn thực hiện các Task một cách dễ dàng hơn trong Rails 5.
2.2. Tạo Task quản lý WEBrick
Trong bài viết này, chúng ta sẽ tạo các tác vụ (task) để quản lý máy chủ web WEBrick của Rails 5. Để bắt đầu, hãy thực hiện lệnh sau để tạo tệp rake.
rails g task server start stop restart
Kết quả của command trên sẽ tạo ra file app/lib/tasks/server.rake có nội dung như sau:
namespace :server do desc "TODO" task start: :environment do end desc "TODO" task stop: :environment do end desc "TODO" task restart: :environment do end end
Chỉnh sửa file trên để thực hiện nhiệm vụ là start, stop, restart WEBrick
namespace :server do desc 'TODO' task start: :environment do print "Starting WEBrickn" system 'rails s -d -b 127.0.0.1' end desc 'TODO' task stop: :environment do pid_file = 'tmp/pids/server.pid' if File.file?(pid_file) print "Shutting down WEBrickn" pid = File.read(pid_file).to_i Process.kill 'INT', pid end File.file?(pid_file) && File.delete(pid_file) end desc 'TODO' task restart: :environment do print "Restarting WEBrickn" system 'rails server:stop' system 'rails server:start' end end
Giờ test thử các task vừa tạo với 3 command sau:
bin/rake server:start bin/rake server:restart bin/rake server:stop
Kết quả thật mỹ mãn
2.3. Liệt kê danh sách các Task
Sử dụng command sau để list danh sách các Task trong Rails
bin/rake -P
2.4. Override lại Task đã có
Ruby on Rails cung cấp sẵn một loạt các tác vụ để quản lý ứng dụng, và điều tốt là chúng ta có khả năng ghi đè lên những tác vụ này. Để định nghĩa lại một tác vụ, chẳng hạn như db:seed, bạn có thể tạo một tệp app/lib/tasks/db.rake với nội dung sau đây:
namespace :db do task seed: :environment do puts "We need modify db:seed task here." end end