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

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

当我运行它时,上面的代码不起作用。

你想invokeexecute 。 从我自己的代码中摘录一下,展示如何传递变量:

 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 

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

 desc 'This rebuilds development db' task :rebuild_dev => ["db:drop", "db:create", "db:migrate", "db:load"] 
 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