【问题标题】:X number of arguments passing to a rake task传递给 rake 任务的 X 个参数
【发布时间】:2015-01-27 17:48:53
【问题描述】:

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

rake 任务:测试[arg1,arg2,arg3,...]

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

有什么想法吗?

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

【问题讨论】:

    标签: ruby rake


    【解决方案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
    

    【讨论】:

    • 感谢回复,所以问题是我不想限制参数的数量;可能有超过 20 个,例如; 1 - 100XX 参数,所以如果我有:myargs = 'p1'.upto('p10000').map{ |x| x.to_sym } 那么这将保留大量内存..
    • 是的,但老实说:当你通过rake mytask[1,2,...100000]调用任务时,10000个参数你会怎么做?
    • 是的,但可以肯定的是,我可能有超过 20 个参数,并且这个任务将被随机调用。无论如何,我对你的答案投了赞成票。目前它是唯一正确的解决方案:)
    【解决方案2】:

    我不知道你是否还需要这个,但这是我的解决方案:

    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
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 2016-04-08
      • 2015-02-14
      • 2011-07-02
      • 2012-05-18
      • 1970-01-01
      相关资源
      最近更新 更多