1

rake タスクに動的 (X) 数の引数を渡す方法を知りたいです。たとえば、これを達成したい:

rake task:test[arg1,arg2,arg3,...]

したがって、ここでは引数の数は固定されていませんarg1..arg10arg1..arg20これより少ない/多い可能性があります。

何か案が?

PS: このタスクにあまり多くのメモリを浪費したくないので、最適な解決策を探しています。ありがとう。

4

2 に答える 2

1

パラメータの最大数を事前に定義できますが、すべてを使用する必要はありません。

require 'rake'
myargs = 'p1'.upto('p20').map{ |x| x.to_sym }

task :test, myargs do |t, args|
  puts "#{t}: #{args.inspect}"
end

Rake.application[:test].invoke(1,2,3,4,5,6,7,8)

結果:

test: {:p1=>1, :p2=>2, :p3=>3, :p4=>4, :p5=>5, :p6=>6, :p7=>7, :p8=>8}

デフォルト値が必要な場合は、次のように定義できます。

task :test, myargs do |t, args|
  args.with_defaults(:p19 => 'default1')
  puts "#{t}: #{args.inspect}"
end

結果:

test: {:p19=>"default1", :p1=>1, :p2=>2, :p3=>3, :p4=>4, :p5=>5, :p6=>6, :p7=>7, :p8=>8}

デフォルト値でパラメーターを定義する別の方法:

myargs = Hash.new{|hash,key| hash[key] = "Default #{key}"}
20.times{|i| myargs[:"p#{i}"] }

task :test, myargs.keys do |t, args|
  args.with_defaults(myargs)
  puts "#{t}: #{args.inspect}"
end
于 2013-02-04T10:46:26.333 に答える
0

まだこれが必要かどうかはわかりませんが、私の解決策は次のとおりです。

task :test, [:arg] do |t,args|
   arguments = Array.new
   arguments << args.arg
   args.extras.each{|a| arguments << a}
   puts arguments
end

結果:

rake test[arg1,arg2,arg3,arg4,...]
arg1
arg2
arg3
arg4
...
于 2015-01-27T09:48:53.510 に答える