2009-12-11 38 views
24

Thay vì chạy mỗi công việc cào cá nhân như thế này:Kết hợp nhiều nhiệm vụ cào cào vào một nhiệm vụ

rake db:drop 
rake db:create 
rake db:migrate 
rake db:load 

Tôi muốn chạy một nhiệm vụ cào mà làm tất cả cho.

Đây là những gì tôi có cho rakefile tôi:

desc 'This rebuilds development db' 
namespace :rebuild_dev do 
Rake::Task["db:drop"].execute 
Rake::Task["db:create"].execute 
Rake::Task["db:migrate"].execute 
Rake::Task["db:load"].execute 
end 

Ở trên không hoạt động khi tôi chạy nó.

Trả lời

23

Bạn muốn invoke không execute. Một trích đoạn nhỏ từ mã của riêng tôi cho thấy làm thế nào để vượt qua các biến:

namespace :clients do 

    task :create, [:client] => ["clients:creation:checks"] do |t, args| 
    Rake::Task["clients:creation:git"].invoke(client, password) 
    Rake::Task["server:virtualhost:create"].invoke(client) 
    Rake::Task["server:virtualhost:enable"].invoke(client) 
    Rake::Task["server:reload"].invoke 
    Rake::Task["db:roles:create"].invoke(client, password) 
    Rake::Task["db:create"].invoke(client, client) 
    Rake::Task["db:migrate"].invoke(client) 
    end 

end 

Ngoài ra, bạn có thể làm nhiệm vụ phụ thuộc vào công việc khác như tôi đã làm ở trên với :create tùy thuộc vào clients:creation:checks.

Chỉ cần làm rõ, không gian tên là để nhóm các tác vụ, vì vậy bạn phải thực sự xác định các tác vụ trong vùng tên như tôi đã nêu ở trên. Bạn không thể đơn giản gọi các nhiệm vụ từ bên trong một không gian tên.

Vì vậy, mã của bạn ở trên nên là:

desc 'This rebuilds development db' 
task :rebuild_dev do 
    Rake::Task["db:drop"].invoke 
    Rake::Task["db:create"].invoke 
    Rake::Task["db:migrate"].invoke 
    Rake::Task["db:load"].invoke 
end 
+0

Cảm ơn! Nó đã được gọi! – Amir

+0

tại sao 'invoke', tôi có thể sử dụng' execute' có nghĩa là 'execute (client)' –

+1

@AMICMING - 'execute' sẽ chỉ chạy tác vụ trong khi' invoke' sẽ chạy bất kỳ phụ thuộc nào. Ngoài ra, nó sẽ chỉ chạy tác vụ nếu cần. * Lưu ý: Đây là trường hợp cách đây 8 năm; Tôi thành thật không biết nếu nó đã thay đổi kể từ đó. * Http://chrisroos.co.uk/blog/2007-12-06-ruby-rake-invoke-vs-execute –

3
namespace :rebuild_dev do 
desc 'This rebuilds development db' 
    task :clean_slate => :environment do 
    Rake::Task["db:drop"].invoke 
    Rake::Task["db:create"].invoke 
    Rake::Task["db:migrate"].invoke 
    Rake::Task["db:load"].invoke 
    end 
end 
64

Bạn có thể làm điều đó với phụ thuộc vào một nhiệm vụ không có cơ thể.

desc 'This rebuilds development db' 
task :rebuild_dev => ["db:drop", "db:create", "db:migrate", "db:load"] 
+1

+1 - Thú vị. Tôi không bao giờ biết rằng. Cảm ơn câu trả lời! –

+0

Cách này hoạt động như thế nào khi truyền tham số cho các nhiệm vụ phụ? –

Các vấn đề liên quan