複数のデータベースに値を挿入する必要がある rake タスクがあります。
この値をコマンドラインから、または別のrake タスクから rake タスクに渡したいと思います。
これどうやってするの?
ベストアンサー1
タスク呼び出しにシンボル引数を追加することで、rake で正式な引数を指定できます。例:
require 'rake'
task :my_task, [:arg1, :arg2] do |t, args|
puts "Args were: #{args} of class #{args.class}"
puts "arg1 was: '#{args[:arg1]}' of class #{args[:arg1].class}"
puts "arg2 was: '#{args[:arg2]}' of class #{args[:arg2].class}"
end
task :invoke_my_task do
Rake.application.invoke_task("my_task[1, 2]")
end
# or if you prefer this syntax...
task :invoke_my_task_2 do
Rake::Task[:my_task].invoke(3, 4)
end
# a task with prerequisites passes its
# arguments to it prerequisites
task :with_prerequisite, [:arg1, :arg2] => :my_task #<- name of prerequisite task
# to specify default values,
# we take advantage of args being a Rake::TaskArguments object
task :with_defaults, :arg1, :arg2 do |t, args|
args.with_defaults(:arg1 => :default_1, :arg2 => :default_2)
puts "Args with defaults were: #{args}"
end
次に、コマンドラインから次の操作を実行します。
> rake my_task[1,false] 引数は、クラス Rake::TaskArguments の {:arg1=>"1", :arg2=>"false"} でした arg1 は '1' (クラス String) でした arg2 は 'false' (String クラス) でした > rake "my_task[1, 2]" 引数は次のとおりです: {:arg1=>"1", :arg2=>"2"} > rake でタスクを呼び出します 引数は次のとおりです: {:arg1=>"1", :arg2=>"2"} > rake でinvoke_my_task_2を実行します 引数は次のとおりです: {:arg1=>3, :arg2=>4} > 前提条件付きレーキ[5,6] 引数は次のとおりです: {:arg1=>"5", :arg2=>"6"} > rake with_defaults デフォルトの引数は次のとおりです: {:arg1=>:default_1, :arg2=>:default_2} > rake with_defaults['x','y'] デフォルトの引数は次のとおりです: {:arg1=>"x", :arg2=>"y"}
2 番目の例で示されているように、スペースを使用する場合は、シェルがスペースで引数を分割しないように、ターゲット名を引用符で囲む必要があります。
rake.rbのコードを見ると、 rake はタスク文字列を解析して前提条件の引数を抽出しないため、 は実行できないようです。前提条件に異なる引数を指定する唯一の方法は、やtask :t1 => "dep[1,2]"
のように、依存タスク アクション内で明示的に呼び出すことです。:invoke_my_task
:invoke_my_task_2
一部のシェル (zsh など) では括弧をエスケープする必要があることに注意してください。rake my_task\['arg1'\]