37

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}

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

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

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

4

5 に答える 5

48

解決策の 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 を使用しています

于 2012-08-21T13:48:56.000 に答える
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 に答える