メソッドとして実装されたカスタムのレーキタスクがあり、メソッドの「上」にあります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
。そして、それらを正しい種類の引数に変えるためにどのような呼び出しを行うべきかがよくわかりません。