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 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]