web-dev-qa-db-ja.com

rakeタスクに複数のパラメーターを渡す方法

複数のパラメータを渡したいのですが、数値がわかりません。モデル名など。これらのパラメーターをrakeタスクに渡す方法と、rakeタスク内でこれらのパラメーターにアクセスする方法を教えてください。

お気に入り、 $ rake test_rake_task[par1, par2, par3]

29
krunal shah

あなたはそのようなことを試みるかもしれません:

rake test_rake_task SOME_PARAM=value1,value2,value3

そしてレーキタスクで:

values = ENV['SOME_PARAM'].split(',')
11
lest

Rakeは、ENVハックを使用せずに、配列を使用してパラメーターをタスクに直接渡すことをサポートしています。

次のようにタスクを定義します。

task :my_task, [:first_param, :second_param] do |t, args|
  puts args[:first_param]
  puts args[:second_param]
end

そしてそれをこのように呼んでください:

rake my_task[Hello,World]
=> Hello
   World

VigetブログのPatrick Reaganによるこの記事はそれをうまく説明しています

61

args.extrasを使用すると、パラメーターの数を明示的に指定せずに、すべての引数を反復処理できます。

例:

desc "Bring it on, parameters!"
task :infinite_parameters do |task, args| 
    puts args.extras.count
    args.extras.each do |params|
        puts params
    end         
end

走る:

rake infinite_parameters['The','World','Is','Just','Awesome','Boomdeyada']

出力:

6
The
World
Is
Just
Awesome
Boomdeyada
58
Ardee Aram

Args.valuesを使用します。

task :events, 1000.times.map { |i| "arg#{i}".to_sym } => :environment do |t, args|
  Foo.use(args.values)
end
8
Sergei

この例をこの ブログ投稿で見つけましたが、構文は少しわかりやすいようです。

たとえば、say_helloタスク、次のように、任意の数の引数を使用して呼び出すことができます。

$ rake say_hello Earth Mars Venus

これがその仕組みです:

task :say_hello do
  # ARGV contains the name of the rake task and all of the arguments.
  # Remove/shift the first element, i.e. the task name.
  ARGV.shift

  # Use the arguments
  puts 'Hello arguments:', ARGV

  # By default, rake considers each 'argument' to be the name of an actual task. 
  # It will try to invoke each one as a task.  By dynamically defining a dummy
  # task for every argument, we can prevent an exception from being thrown
  # when rake inevitably doesn't find a defined task with that name.
  ARGV.each do |arg|
    task arg.to_sym do ; end
  end

end
8
Gautam