有没有办法将后期绑定的放置/日志记录附加到rake任务?

时间:2017-05-06 00:22:34

标签: lambda rake rake-task late-binding rakefile

如果我的Rakefile中定义了一个如下所示的任务:

MyLibrary::CopySrcTask.new(:copySrc) do |task|
  puts "Copying source"
  task.src_dir = 'src/'
  task.destination = 'build/lib/'
end

我已经意识到,即使我指定了puts任务为的rake目标,上述任务中的:copySrc也会执行没有执行。我想知道是否有一种方法以后期绑定方式指定puts,这样只有在rake任务本身被执行时才会执行它?

这可能看起来不是什么大问题,但它肯定会让调试变得更容易,而且当你考虑这样的情况时,它会成为一个更大的交易:

MyLibrary::CopySrcTask.new(:copySrc) do |task|
  task.src_dir = complex_function_which_affects_filesystem()
  task.destination = 'build/lib/'
end

现在在这种情况下,即使没有运行任务,它与puts获得评估的问题基本相同,但现在而不仅仅是多余的puts调用,它正在做一些搞乱文件系统的整个操作。是否有任何方法可以使任务初始化中的所有代码仅在任务本身执行时执行?

如果这样的事情有效,那就太棒了:

MyLibrary::CopySrcTask.new(:copySrc) do |task|
  lambda do  # this code will only be run if the task gets run
    puts "Copying source"
    task.src_dir = complex_function_which_affects_filesystem()
    task.destination = 'build/lib/'
  end
end

我应该注意到我正在使用的任务来自一个库,所以我不能只编辑任务本身。

1 个答案:

答案 0 :(得分:0)

这是我发现似乎有效的解决方案/黑客:

task :copySrc do |t|
  MyLibrary::CopySrcTask.new(:internalCopySrc) do |task|
    puts "Copying source"
    task.src_dir = complex_function_which_affects_filesystem()
    task.destination = 'build/lib/'
  end
  Rake::Task[:internalCopySrc].invoke
end

将每个库任务包装在另一个任务中,然后手动调用子任务......它不漂亮,但它可以工作。