如何使我的自定义Rake任务* args像内置的Rake任务* args一样工作?

时间:2013-03-04 15:47:30

标签: ruby rake albacore

我有一个自定义rake任务,作为一种方法实现,位于task方法的“上方”。它与自定义配置对象一起使用,使整个事物具有更具声明性的感觉。在这里。

def robocopy(*args, &block)
  config = RobocopyConfiguration.new
  block.call config

  body = proc { 
    system "robocopy #{config.make_parameters.join ' '}"
  }

  Rake::Task.define_task *args, &body
end

class RobocopyConfiguration
  attr_accessor :source, :destination, :files
  attr_reader :mirror

  def mirror
    @mirror = true
  end

  def make_parameters
    parameters = [ @source, @destination ]
    parameters << @files.flatten if @files
    parameters << '/MIR' if @mirror
    parameters
  end
end

你可以将它声明为具有名称和依赖关系的普通rake任务。

robocopy :copy => [ :build ] do |cmd|
  cmd.source = File.expand_path File.dirname __FILE__
  cmd.destination = '//some/default/network/share'
  cmd.mirror
end

然而,只要你添加参数,事情就会爆发。

robocopy :copy, [ :destination ] => [ :build ] do |cmd, args|
  args.with_defaults(:destination => '//some/default/network/share')

  cmd.source = File.expand_path File.dirname __FILE__
  cmd.destination = args[:destination]
  cmd.mirror
end

cmd> rake copy['//some/network/share']
rake aborted!
undefined method `with_defaults' for nil:NilClass

我怀疑*args没有变成TaskArguments,使用所有特殊方法,它们会立即在自定义block.call中使用。我无法弄明白what call to make将它们变成正确的论点。

0 个答案:

没有答案