如何从Rake任务中运行Rake任务?

402 ruby rake

我已经编译在两个方面项目Rake文件,根据全局变量$build_type,它可以是:debug:release(结果走在不同的目录):

task :build => [:some_other_tasks] do
end
Run Code Online (Sandbox Code Playgroud)

我希望创建一个任务,依次编译项目的两个配置,如下所示:

task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    # call task :build with all the tasks it depends on (?)
  end
end
Run Code Online (Sandbox Code Playgroud)

有没有办法将任务称为方法?或者我怎样才能达到类似的效果呢?

kch*_*kch 625

如果您需要将任务作为一种方法,那么使用实际方法呢?

task :build => [:some_other_tasks] do
  build
end

task :build_all do
  [:debug, :release].each { |t| build t }
end

def build(type = :debug)
  # ...
end
Run Code Online (Sandbox Code Playgroud)

如果你更喜欢坚持自己rake的习语,那么根据过去的答案编写你的可能性:

  • 如果问题中的任务采用参数,则可以将它们作为参数传递给#invoke.例如.`耙::任务[ '与:ARGS']调用( "比萨饼")`. (122认同)
  • 请注意,如果您的任务位于名称空间中,则必须在调用任务时包含名称空间.例如.`瑞克::任务[ '分贝:复位'] invoke`. (95认同)
  • 如果需要设置环境变量,请在调用invoke之前执行此操作.例如:`ENV ['VERSION'] ='20110408170816'; Rake :: Task ['db:migrate'].invoke`有关详细说明,请参阅[here](http://rubyforge.org/pipermail/rake-devel/2009-January/000712.html). (24认同)
  • 我最近发现`#reenable()`没有重新启用pre-req,需要它.[此添加](https://github.com/jimweirich/rake/pull/168)到Rake(> = 10.3.2),[`#all_prerequisite_tasks()`](http://ruby-doc.org/ stdlib-2.1.1/libdoc/rake/rdoc/Rake/Task.html#method-i-all_prerequisite_tasks)将迭代所有任务,包括pre-req的pre-req.所以,`Rake :: Task [task] .all_prerequisite_tasks.each&:reenable` (11认同)
  • @kch,你能把它们串在一起吗(比如命令行`rake db:reset db:migrate`).你可以这样做:`Rake :: Task ["db:reset","db:migrate"].invoke` (4认同)

Mar*_*ski 123

例如:

Rake::Task["db:migrate"].invoke
Run Code Online (Sandbox Code Playgroud)

  • 仅当尚未调用任务时,才会调用该任务.但是我需要用两次依赖的所有其他任务来调用任务. (6认同)

小智 56

task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
  end
end
Run Code Online (Sandbox Code Playgroud)

那应该把你排除在外,只需要自己做同样的事情.


pjb*_*jb3 11

task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].execute
  end
end
Run Code Online (Sandbox Code Playgroud)


Nee*_*mar 11

task :invoke_another_task do
  # some code
  Rake::Task["another:task"].invoke
end
Run Code Online (Sandbox Code Playgroud)