如何将数组作为参数传递给Rake任务?

问题描述 投票:24回答:4

我正在写一个Rake任务,我想传递一个数组作为其中一个参数。这就是我目前的方式。

task :change_statuses, :ids, :current_status, :new_status do |task, args|
  puts "args were #{args.inspect}"
end

我尝试过以下方式运行任务:

# First argument as array
rake "change_statuses[[1,2,3], active, inactive]"

# First argument as string
rake "utility:change_account_statuses['1,2,3', foo, bar]"

我的预期输出是:

args were {:ids=> [1,2,3], :current_status=> 2 , :new_status=> 3}

但是,我在每种情况下的实际输出是:

args were {:ids=>"[1", :current_status=>"2", :new_status=>"3]"}

如何将数组传递给Rake任务?

ruby rake
4个回答
35
投票

其中一个问题是避免在字符串中使用,符号,因此您的命令行将如下所示:

$ rake change_statuses['1 2 3', foo, bar]

然后你可以简单地拆分ID:

# Rakefile

task :change_statuses, :ids, :current_status, :new_status do |task, args|
  ids = args[:ids].split ' '

  puts "args were #{args.inspect}"
  puts "ids were #{ids.inspect}"
end

或者您可以解析ids值以获得预期的输出:

args[:ids] = args[:ids].split(' ').map{ |s| s.to_i }

我正在使用rake 0.8.7


0
投票
rake "change_statuses[1 2 3, foo, bar]"

这适用于我,你不应该配额1 2 3'

task :import_course, [:cids, :title] => :environment do |t, args|
  puts args[:cids]
end

如果你将1 2 3配额作为正确的答案,args [:cids]将是“'1 2 3'”,其中包括'字符,你必须修剪'字符,但如果你使用我的答案,args [:cids]将是“1 2 3”,这更容易使用,你只需要args [:cids] .split(“”)得到[1,2,3]


0
投票

实现此目的的另一种方法,也赢得了传递哈希的能力

namespace :stackoverflow do
  desc "How to pass an array and also a hash at the same time 8-D"
  task :awesome_task, [:great_attributes] do |task, args|
    options = Rack::Utils.parse_nested_query(args[:attributes])
    puts option
  end
end

只需像这样调用rake任务:

bundle exec rake "player_rules:awesome_task[what_a_great_key[]=I know&what_a_great_key[]=Me too\!&i_am_a_hash[and_i_am_your_key]=what_an_idiot]"

这将打印出来

{"what_a_great_key"=>["I know", "Me too!"], "i_am_a_hash"=>{"and_i_am_your_key"=>"what_an_idiot"}}

0
投票

你可以这样做:

 task :my_task, [:values] do |_task, args|
   values = args.values.split(',')
   puts values
 end

并使用运行任务

rake my_task"[1\,2\,3]"
© www.soinside.com 2019 - 2024. All rights reserved.