web-dev-qa-db-ja.com

Rakeタスク内からRakeタスクを実行する方法

私は2つの方法でプロジェクトをコンパイルするRakefileを持っています。グローバル変数$build_type:debugまたは:releaseにすることができます(結果は別々のディレクトリに入ります):

task :build => [:some_other_tasks] do
end

このように、プロジェクトを両方の構成で順番にコンパイルするタスクを作成したいと思います。

task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    # call task :build with all the tasks it depends on (?)
  end
end

それがメソッドであるかのようにタスクを呼び出す方法はありますか?それとも、どうすれば同じようなことができますか?

393
Arry

タスクがメソッドとして振る舞う必要がある場合は、実際のメソッドを使用してみてはどうですか?

task :build => [:some_other_tasks] do
  build
end

task :build_all do
  [:debug, :release].each { |t| build t }
end

def build(type = :debug)
  # ...
end

rakeのイディオムに固執したいのなら、過去の答えからまとめたあなたの可能性はここにあります:

  • これは常にタスクを実行しますが、依存関係は実行しません。

    Rake::Task["build"].execute
    
  • これは依存関係を実行しますが、まだ呼び出されていない場合にのみタスクを実行します。

    Rake::Task["build"].invoke
    
  • これは最初にタスクのalready_invoked状態をリセットして、タスクが再び実行されることを可能にします。

    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
    

    (既に呼び出された依存関係は再実行されません)

617
kch

例えば:

Rake::Task["db:migrate"].invoke
117
Marcin Urbanski
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
  end
end

それはあなたを整理する必要があります、ちょうど私自身が同じことを必要としていました。

55
darkliquid
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].execute
  end
end
11
pjb3
task :invoke_another_task do
  # some code
  Rake::Task["another:task"].invoke
end
6
Neeraj Kumar

失敗に関係なく各タスクを実行したい場合は、次のようにします。

task :build_all do
  [:debug, :release].each do |t| 
    ts = 0
    begin  
      Rake::Task["build"].invoke(t)
    rescue
      ts = 1
      next
    ensure
      Rake::Task["build"].reenable # If you need to reenable
    end
    return ts # Return exit code 1 if any failed, 0 if all success
  end
end
3
bbbco