//FrequentlyAskedQuestions
//4. Frequently Asked Questions
//4. よくある質問と回答
//!4.1 How can I call one Rake task from inside another task?
!4.1 あるタスクの中から別のタスクを呼び出すこには、どうすれば良いのでしょうか?
//Generally, if you want invoke one task from another task, the proper way to do that is to include the task to be invoked as a prerequisite of the task doing the invoking.
通常、あるタスク(:secondary と仮定)から、別のタスク(:primary と仮定)を実施するには、:secondary の前提条件として、:primary が実施済みであることを指定するのが、一般的です。
//For example:
*''例''
// task :primary => [:secondary]
//
// task :secondary do
// puts "Doing Secondary Task"
// end
task :primary => [:secondary]
task :secondary do
puts ":secondary の実施。"
end
//However, there are certain rare occasions where you want to invoke a task from within the body of a primary task. You could do it like this:
しかし、まれにではありますが、:primary タスクの中で、:secondary タスクを実行したいというケースも存在します。その場合は以下のようにして実現できます。
// task :primary do
// Rake::Task[:secondary].invoke
// end
//
// task :secondary do
// puts "Doing Secondary Task"
// end
task :primary do
Rake::Task[:secondary].invoke
end
task :secondary do
puts ":secondary の実施。"
end
//Keep the following in mind:
上記の方法を選んだ場合、以下を念頭に置いてください。
//* The secondary task will be invoked when the body of the primary task is executed.
* :primary タスクが実施される際に、その中で :secondary タスクが実施されます。
//* All prerequisites of the secondary task will be run before it body of the secondary task.
* :secondary タスクのすべての前提条件は、:primary の前ではなく、:secondary タスクの前に実施されます。
//* If the secondary task has already been run, it will not be run again, even though it has been explicitly invoked. Rake tasks can only be invoked once per run.
* もし、一度でも :secondary タスクが実施されれば、例え明示的に指定されても、再度実施されることはありません。Rake のタスクは、実行時に一度だけです
//If the second and third point above are not to your liking, then perhaps you should consider making the secondary task a regular Ruby method and just calling it directly. Something like this:
もし、二つめと三つ目の条件が気に入らない場合は、通常の Ruby のメソッドを使って :secondary タスクと :primary タスクで、そのメソッドを呼び出すことを考慮する必要があるでしょう。以下のようにです。
// task :primary do
// secondary_task
// end
//
// task :secondary do
// secondary_task
// end
//
// def secondary_task
// puts "Doing Secondary Task"
// end
task :primary do
secondary_task
end
task :secondary do
secondary_task
end
def secondary_task
puts ":secondary の実施。"
end