Lambda 有没有办法将延迟绑定put/日志附加到rake任务?

Lambda 有没有办法将延迟绑定put/日志附加到rake任务?,lambda,rake,rake-task,late-binding,rakefile,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 MyLibrary::CopySrcTask.new(:copySrc) do |task| task.src_dir = complex_function_which_af

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

MyLibrary::CopySrcTask.new(:copySrc) do |task|
  puts "Copying source"
  task.src_dir = 'src/'
  task.destination = 'build/lib/'
end
MyLibrary::CopySrcTask.new(:copySrc) do |task|
  task.src_dir = complex_function_which_affects_filesystem()
  task.destination = 'build/lib/'
end
我逐渐意识到,即使我指定了一个rake目标,但上面任务中的
put
将得到执行,而该
:copySrc
任务没有执行。我想知道是否有一种方法可以以后期绑定的方式指定
put
,这样它只有在rake任务本身执行时才会执行

这似乎不是一个大问题,但是它肯定会允许更容易调试,而且,当你考虑这样的情况时,它会变得更大的交易:

MyLibrary::CopySrcTask.new(:copySrc) do |task|
  puts "Copying source"
  task.src_dir = 'src/'
  task.destination = 'build/lib/'
end
MyLibrary::CopySrcTask.new(:copySrc) do |task|
  task.src_dir = complex_function_which_affects_filesystem()
  task.destination = 'build/lib/'
end
现在,在这种情况下,它本质上与
put
得到评估的问题相同,即使任务没有运行,但是现在它不再只是一个多余的
put
调用,而是在执行一些会扰乱文件系统的整个操作。有没有办法使任务初始化中的所有代码只在任务本身执行时执行

如果像这样的事情能奏效,那就太好了:

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

我应该注意,我使用的任务来自一个库,因此我不能只编辑任务本身。

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

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
将每个库任务包装到另一个任务中,然后手动调用子任务。。。虽然不漂亮,但它很管用