37

我正在编写一个 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 任务?

4

5 回答 5

48

解决方案之一是避免,在字符串中使用符号,因此您的命令行如下所示:

$ 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

于 2012-08-21T13:48:56.000 回答
3

另一种实现这一点的方法也赢得了传递哈希的能力

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

只需像这样调用 rake 任务:

bundle exec rake "stackoverflow: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"}}
于 2019-03-08T00:25:49.337 回答
2
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'”,其中'包括 char,您必须修剪'char,但如果您使用我的答案,则 args[:cids] 将是"1 2 3",更容易使用,只需要 args[:cids].split(" ") 就可以得到 [1, 2, 3]

于 2014-11-20T07:22:17.277 回答
1

您也可以尝试稍微改变方法,并尝试使用该arg.extras方法获取 id。

$ rake change_statuses[foo, bar, 1, 2, 3]
task :change_statuses, [:foo, :bar] do |_task, args|
  puts args[:foo]     # => foo
  puts args[:bar]     # => bar
  puts args.extras    # => ["1","2","3"]
end

您可以在本文中找到更多信息 -> https://blog.stevenocchipinti.com/2013/10/18/rake-task-with-an-arbitrary-number-of-arguments/

于 2021-09-06T14:55:07.290 回答
1

您可以这样做:

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

并使用运行任务

rake my_task"[1\,2\,3]"
于 2019-04-05T17:12:09.557 回答