我有一个自定义 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
,所有特殊方法,它们正在被立即用于 custom block.call
。而且我无法完全弄清楚将它们转变为正确类型的论点的调用。