Tìm hiểu Rake trong Rails
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 ...
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 .rakecủ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]