web-dev-qa-db-fra.com

Comment exécuter des tâches Rake à partir de tâches Rake?

J'ai un Rakefile qui compile le projet de deux manières, en fonction de la variable globale $build_type, qui peut être :debug ou :release (les résultats sont placés dans des répertoires séparés):

task :build => [:some_other_tasks] do
end

Je souhaite créer une tâche qui compile le projet avec les deux configurations, à peu près comme ceci:

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

Existe-t-il un moyen d'appeler une tâche comme s'il s'agissait d'une méthode? Ou comment puis-je obtenir quelque chose de similaire?

398
Arry

Si vous avez besoin que la tâche se comporte comme une méthode, pourquoi ne pas utiliser une méthode réelle?

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

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

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

Si vous préférez vous en tenir aux idiomes de rake, voici vos possibilités, compilées à partir de réponses antérieures:

  • Ceci exécute toujours la tâche, mais n'exécute pas ses dépendances:

    Rake::Task["build"].execute
    
  • Celui-ci exécute les dépendances, mais n'exécute la tâche que si elle n'a pas déjà été invoquée:

    Rake::Task["build"].invoke
    
  • Ceci réinitialise d'abord l'état déjà invoqué de la tâche, permettant ainsi à la tâche d'être exécutée à nouveau, dépendances et tout:

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

    (Notez que les dépendances déjà invoquées ne sont pas ré-exécutées)

621
kch

par exemple:

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

Cela devrait vous aider, j'avais juste besoin de la même chose moi-même.

56
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
9
Neeraj Kumar

Si vous souhaitez que chaque tâche soit exécutée indépendamment des échecs, vous pouvez effectuer les opérations suivantes:

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
4
bbbco