Rake là một task runner phổ biến trong Ruby.
Task là gì?
- Sao lưu database
- Chạy test
- Thu thập & báo cáo thống kê
Đây là các task nhỏ mà nếu không có Rake sẽ bị phân rải khắp dự án trên nhiều file khác nhau.
Rake tập trung hóa quyền truy cập vào các task của bạn.
Rake cũng làm cho một số việc dễ dàng hơn, như tìm file khớp với pattern nhất định và được sửa đổi gần đây.
Một điều nữa:
Đừng nhầm lẫn Rake với Rack, tên rất giống, nhưng hoàn toàn khác nhau.
- Rake là task runner.
- Rack giúp Ruby server và framework làm việc cùng nhau.
Bây giờ:
Hãy khám phá Rake chi tiết hơn!
Ai dùng Rake?
Rails!
Nếu bạn đã làm bất cứ gì với Rails, bạn có thể quen với lệnh rake db:migrate.
Hoặc rake routes.
Đó là Rake đang hoạt động ngay đó.
Chú ý rằng Rails, kể từ phiên bản 5.0, cho phép bạn gọi hầu hết lệnh rake với rails thay thế.
Nói cách khác:
Bạn có thể làm rails db:migrate, nhưng Rake vẫn là thứ làm việc thực tế.
Cách viết một Rake Task
Đây là một Rake task đơn giản:
desc "Print reminder about eating more fruit." task :apple do puts "Eat more apples!" end
Bạn có thể đặt code này trong file tên Rakefile, hoặc nếu bạn dùng Rails, bạn có thể lưu nó dưới lib/tasks/apple.rake.
Để chạy task này:
rake apple # "Eat more apples!"
Bên trong task, bạn có thể viết code Ruby bình thường, nhưng có một số phương thức Rake hữu ích bạn có thể dùng.
Ví dụ:
- ruby (chạy file Ruby)
- sh (chạy lệnh hệ thống)
- safe_ln (tạo symbolic link trong hệ thống file)
Rake bao gồm module FileUtils.
Điều đó có nghĩa là bạn có thể copy file với cp, tạo thư mục với mkdir_p, thậm chí thay đổi quyền file với chown.
Ví dụ:
task :clean_cache do rm_r FileList["tmp/cache/*"] end
Cẩn thận với rm_r (xóa đệ quy) vì nó sẽ xóa file mà không xác nhận, nếu bạn muốn thêm bước xác nhận, bạn có thể thêm dependent task (được đề cập sau) và raise exception nếu không muốn tiếp tục.
Chạy lệnh Rake trong thư mục khác
Bạn có thể muốn chạy lệnh Rake trong một thư mục cụ thể.
Cách làm:
task :import do
puts "Importing data..."
Dir.chdir(Rails.root.join("data")) { ruby "load-data.rb" }
end
Trong ví dụ này, tôi đang chạy script Ruby bên trong thư mục data trong dự án Rails của tôi.
Cách dùng Namespaces trong Rake
Vì task có thể có tên tương tự, dễ dàng dùng trùng tên hai lần.
Đó là lý do Rake có namespaces.
Ví dụ:
Bạn có thể tạo namespace backup cho tất cả task backup của bạn.
Như sau:
namespace :backup do
task :create do
# ...
end
task :list do
# ...
end
task :restore do
# ...
end
end
Để chạy task có namespace:
rake backup:create
Dependent Tasks (Task phụ thuộc)
Rake cho phép bạn định nghĩa danh sách các task khác phải chạy trước task hiện tại.
Với điều này, bạn có thể làm bất kỳ thiết lập nào task cần.
Ví dụ:
task create_examples: "load_database" do # ... end
Trong ví dụ này, load_database sẽ chạy trước create_examples.
Danh sách task phụ thuộc cũng có thể là mảng chuỗi hoặc mảng symbol.
Chạy Rake Task bên trong Task khác
Thay vì có tập task chạy TRƯỚC task hiện tại, nếu bạn muốn chạy task khác BÊN TRONG task hiện tại, bạn có thể dùng code sau.
Ví dụ:
task :coverage do ENV['COVERAGE'] = 'true' Rake::Task["test"].execute end
Điều này có thể hữu ích để thiết lập biến môi trường bật test coverage và các tùy chọn khác.
Cách dùng Rake Rules
Rules định nghĩa chuyển đổi đuôi file.
Ví dụ:
task compress: FileList["/tmp/*.txt"].ext(".txt.gz")
rule '.txt.gz' => '.txt' do |t|
sh "gzip", "-k", "-f", t.source
end
Lợi ích của việc dùng rules là một khi file đã được nén, nó sẽ không bị nén lại cho đến khi file nguồn thay đổi.
Chú ý vài điều trong code này:
- Chúng ta dùng class
FileList, thuộc Rake, để định nghĩa danh sách file muốn làm việc. - Rule bắt đầu bằng đuôi MỤC TIÊU, để rule khớp, chúng ta phải dùng
.ext(".txt.gz")trênFileList. .txt.gz => .txtnày không có nghĩa là chúng ta đi từtxt.gzsangtxt, mà ngược lại. Mũi tên là cú pháp hash.
Rake Options & Commands (Tùy chọn & Lệnh Rake)
Danh sách tùy chọn Rake hữu ích:
- rake -T (liệt kê task có sẵn)
- rake -P (liệt kê task & phụ thuộc của chúng)
- rake -W (liệt kê task & nơi chúng được định nghĩa)
- rake -V (chế độ verbose, echo lệnh hệ thống)
- rake -t (chế độ debug)
- rake -f (dùng Rakefile cụ thể)
Ví dụ, trong ứng dụng Rails:
> rake -T test rake test # Runs all tests in test folder except system ones rake test:db # Run tests quickly, but also reset db rake test:system # Run system tests only
Tóm tắt
Bạn đã học về Rake, một task runner phổ biến cho Ruby.
Dùng rake -T để biết task nào có sẵn, tạo task riêng & thêm vào Rakefile, hoặc bên trong thư mục lib/tasks, và nhớ rằng Rake và Rack là hai thứ khác nhau.

Đừng quên chia sẻ bài viết này để nhiều người hơn có thể thưởng thức 🙂
Cảm ơn bạn đã đọc!