24

而不是像这样单独运行每个 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

当我运行它时,上面的内容不起作用。

4

3 回答 3

68

您可以依赖于没有主体的任务来做到这一点。

desc 'This rebuilds development db'
task :rebuild_dev => ["db:drop", "db:create", "db:migrate", "db:load"]
于 2009-12-12T08:25:40.110 回答
24

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
于 2009-12-11T20:38:09.260 回答
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
于 2009-12-11T20:43:03.203 回答