【问题标题】:Combining many rake tasks into one rake task将许多 rake 任务组合成一个 rake 任务
【发布时间】:2010-12-25 19:57:04
【问题描述】:

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

上面运行时不起作用。

【问题讨论】:

    标签: ruby-on-rails rake task


    【解决方案1】:

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

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

    【讨论】:

    • 将参数传递给子任务时如何工作?
    【解决方案2】:

    你想要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
    

    【讨论】:

    • 为什么invoke,我可以用execute 表示execute(client)
    • @AMICMING - execute 将只运行任务,而invoke 将运行任何依赖项。此外,它只会在需要时运行任务。 注意:这是 8 年前的情况;老实说,我不知道从那以后它是否发生了变化。 chrisroos.co.uk/blog/2007-12-06-ruby-rake-invoke-vs-execute
    • @Topher Fangio,感谢您的回复。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 2013-05-12
      • 2012-03-22
      • 2010-10-09
      • 2017-10-04
      • 1970-01-01
      相关资源
      最近更新 更多