Bạn có thể sử dụng invoke
và reenable
để thực hiện nhiệm vụ một lần thứ hai.
Cuộc gọi mẫu của bạn rake blog:post Title
dường như có tham số. Tham số này có thể được sử dụng như một tham số trong invoke
:
Ví dụ:
require 'rake'
task 'mytask', :title do |tsk, args|
p "called #{tsk} (#{args[:title]})"
end
Rake.application['mytask'].invoke('one')
Rake.application['mytask'].reenable
Rake.application['mytask'].invoke('two')
Hãy thay thế mytask
với blog:post
và thay vào đó định nghĩa công việc bạn có thể require
rakefile của bạn.
Giải pháp này sẽ ghi kết quả vào thiết bị xuất chuẩn - nhưng bạn không đề cập đến, mà bạn muốn chặn đầu ra.
Thú vị thí nghiệm:
Bạn có thể gọi reenable
cũng bên trong định nghĩa nhiệm vụ. Điều này cho phép một nhiệm vụ có thể tự bật lại.
Ví dụ:
require 'rake'
task 'mytask', :title do |tsk, args|
p "called #{tsk} (#{args[:title]})"
tsk.reenable #<-- HERE
end
Rake.application['mytask'].invoke('one')
Rake.application['mytask'].invoke('two')
Kết quả (thử nghiệm với cào 10.4.2):
"called mytask (one)"
"called mytask (two)"
Với Rails 3.1 rake/rdoctask đã bị phản đối và nhiệm vụ/đường ray là mất tích. Các công trình trên chỉ tốt với tuyên bố yêu cầu đầu tiên. – jwadsack
Để thay đổi stdout, tôi khuyên bạn nên lưu luồng gốc thông qua '# dup', sau đó' # reopen' thành 'Tempfile' được đọc sau khi mở lại bản gốc. Chỉ gán '$ stdout' sẽ không hoạt động nếu tác vụ sử dụng hằng số' STDOUT', hoặc chạy một chương trình bên ngoài. – Kelvin
Lưu ý rằng 'rake_require' luôn tham gia đường dẫn đã cho với mỗi đường dẫn từ mảng' $ LOAD_PATH' và kiểm tra sự tồn tại của một tệp. Vì vậy, đối số đầu tiên phải là ** đường dẫn tương đối **. Nó sẽ được coi là tương đối ngay cả khi nó có chứa dấu gạch chéo hàng đầu (hoặc dấu gạch chéo ngược trên các hệ thống không phải Unix). – siefca