web-dev-qa-db-ja.com

配列を引数としてRakeタスクに渡すにはどうすればよいですか?

Rakeタスクを作成していて、引数の1つとして配列を渡したいと思います。これが私が現在持っている方法です。

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}

ただし、それぞれの場合のactual出力は次のとおりです。

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

配列をRakeタスクに渡すにはどうすればよいですか?

29
Nathan Long

解決策の1つは、文字列内の,記号を回避することです。そのため、コマンドラインは次のようになります。

$ 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 }

私はレーキ0.8.7を使用しています

36
Andrew
rake "change_statuses[1 2 3, foo, bar]"

これは私にとってはうまくいきます、あなたは 'で123を割り当てるべきではありません

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

正解として12 3を割り当てた場合、args [:cids]は "'1 2 3'"になり、' charが含まれているため、' charをトリミングする必要がありますが、私の答え、args [:cids]は "1 2 3"になります。これはより使いやすく、[1、2、3]を取得するにはargs [:cids] .split( "")が必要です。

1
William Herry

これを達成し、ハッシュを渡す機能を獲得する別の方法

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]"
0
Spyros