将许多rake任务组合到一个rake任务中

时间:2009-12-11 20:33:24

标签: ruby-on-rails rake task

而不是像这样单独运行每个rake任务:

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

我想运行一个完成所有操作的rake任务。

这就是我对rakefile的所作所为:

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

运行时,上述操作无效。

3 个答案:

答案 0 :(得分:67)

您可以依赖没有正文的任务来执行此操作。

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

答案 1 :(得分:23)

您希望invoke不是execute。从我自己的代码中摘录一下,展示如何传递变量:

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

或者,你可以让任务依赖于另一项任务,就像我上面用:create做的那样取决于clients:creation:checks

为了澄清,命名空间用于分组任务,因此您必须如上所述在命名空间内实际定义任务。您不能简单地在命名空间内调用任务。

所以上面的代码应该是:

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

答案 2 :(得分: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