使用前/后挂钩包装rake任务

时间:2016-08-16 19:26:15

标签: ruby-on-rails rake

我的rails应用程序在lib/tasks/*

下定义了几个自定义rake任务

当任何这些任务运行时,我想输出日志STARTSTOP消息。

对于个人佣金任务,我可以做类似

的事情
namespace :foo do
  task :bar, [:some_arg] => :some_pre_requisite do |t, args|
    Rails.logger.info "Rake START - {task: \"#{t}\", args: #{args}}"

    # Do stuff

    Rails.logger.info "Rake STOP - {task: \"#{t}\", args: #{args}}"
  end
end

这会运行一个rake任务,它接受一个参数:some_arg,运行一个先决任务(:some_pre_requisite),然后运行该任务。它在说我的任务已经开始和停止之前和之后输出日志语句。

如果我有几十个任务,这真的很重复。我喜欢用其他方法“包装”rake任务

  • 打印START声明
  • 调用/ yield /运行名为
  • 的实际rake任务
  • 打印STOP声明

我知道我可以将第一个印刷品设置为先决条件,然后将第二个印刷品设置为单独的增强任务,但这感觉很麻烦。它将两个打印报表存储在不同的位置,而且我必须单独手动enhance每个任务。

有关如何实现这一目标的更好的想法吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

关于后钩:

Rake::Task['db:migrate'].enhance do
  puts "AFTER"
end

http://ruby-doc.org/stdlib-2.0.0/libdoc/rake/rdoc/Rake/Task.html#method-i-enhance

对于before hook(未经测试):

task :before do
  puts "BEFORE"
end

Rake::Task['db:migrate'].enhance(['before'])