传递给rake任务的X个参数

时间:2013-02-04 10:15:01

标签: ruby rake

我只是想知道如何将动态(X)数量的参数传递给rake任务。 例如,我想实现这个目标:

  

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

所以这里参数的数量不固定,可以是arg1..arg10arg1..arg20,也可以是更少/更多。

任何想法?

P.S:我不想为这项任务浪费太多记忆,因此我正在寻找最佳解决方案。 感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
...