Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Làm chủ Rake trong Ruby: Hướng dẫn hoàn chỉnh tự động hóa Task

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:

  1. Chúng ta dùng class FileList, thuộc Rake, để định nghĩa danh sách file muốn làm việc.
  2. 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ên FileList.
  3. .txt.gz => .txt này không có nghĩa là chúng ta đi từ txt.gz sang txt, 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.

Làm chủ Rake trong Ruby: Hướng dẫn hoàn chỉnh tự động hóa Task

Đừ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!