Tìm hiểu Rake trong Rails
Bài đăng này đã không được cập nhật trong 8 năm
1. Rake là gì?
Khi lập trình ứng dụng với Rails bạn đã quá quen với cái câu lệnh như rake db:create
, rake db:migrate
hay rake db:seed
...Những câu lệnh trên nhằm mục đích chạy các ruby code bên trong các Makefile. Rake cho phép bạn định nghĩa list các task kèm theo dependency của nó, với mục đích gom nhóm các đoạn code Ruby thường xuyên được thực hiện vào một task chung và sử dụng lại chúng nhiều lần.
2. ĐỊNH NGHĨA RAKE FILE
Tạo rake file bằng cách tạo file mới .rake, hoặc dùng lệnh sau trong project rails:
rails g task [namespace] [task]
Lệnh trên sẽ tạo 1 file .rake
trong thư mục lib/tasks
với tên file trùng với tên task của bạn
Viết code định nghĩa task bạn cần thực hiện, chú ý định nghĩa dependency :enviroment
để có thể load các dữ liệu cần thiết từ rails app nhé chẳng hạn như các model, …
namespace :namespace do
desc "This is for description"
task task: :environment do
#do_something
end
end
Kiểm tra lại danh sách các tasks được định nghĩa trong hệ thống
rake -T
Chạy file .rake
của bạn.
rake namespace:task
3. Sử dụng tham số hoặc biến ENV trong rake task
Cách 1: Sử dụng biến ENV
task task: :enviroment do
puts ENV["VARIABLE"]
end
Câu lệnh chạy:
rake VARIABLE=123 task
Cách 2: Truyền tham số
task :task, [:first_arg, :second_arg] => :environment do
puts "First #{args.first_arg}, second #{args.second_arg}"
end
gọi task:
rake task[12, 34]
4. Sử dụng với namespace
Rake cho phép bạn định nghĩa các tasks trong các namespace khác nhau với mục đích phân nhóm các tasks có cùng nhiệm vụ vào chung một group. Cách định nghĩa
namespace :import do
task :missions do
end
task :stages do
end
end
5. Thêm mô tả chi tiết cho rake task
Bạn có thể thêm các đoạn mô tả chi tiết cho từng task với desc
desc "This is the description for this task"
task :task do
end
6. Một task gọi nhiều tasks khác
task all: [:task_A, :task_B, :task_C]
task :all
trên sẽ gọi thực hiện theo tuân tự các task khác là :task_A, :task_B, :task_C
7. Định nghĩa lại một task
Bạn muốn định nghĩa task rake db:migrate mặc định? Bạn có thể định nghĩa lại task đó với cùng tên, tuy nhiên bạn chú ý task định nghĩa mới không override hoàn toàn task cũ mà chỉ định nghĩa thêm các lệnh phía sau task đó.
namespace :db do
task migrate: :environment do
puts "do_something"
end
end
8. Invoke một task khác bên trong một task
task :task_A do
Rake::Task["task_B"].invoke
puts "The code for task A"
end
9. Default rake task
Bạn muốn mỗi lần đánh rake là sẽ tự động chạy một task nào đó mặc định, dùng với task name :default
task default: [:task_A, :task_B]
All rights reserved