J'ai un Rakefile qui compile le projet de deux manières, selon la variable globale $build_type
, qui peut être :debug
ou :release
(les résultats vont 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 à tour de rôle avec les deux configurations, quelque chose 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?
Rake::Task["build"].invoke
peut être beaucoup plus performant que d'utilisersystem rake build
car il n'a pas besoin de créer un nouveau thread et de charger l'environnement Rails, ce quisystem rake build
doit être fait.Réponses:
Si vous avez besoin que la tâche se comporte comme une méthode, pourquoi ne pas utiliser une méthode réelle?
Si vous préférez vous en tenir aux
rake
idiomes de, voici vos possibilités, compilées à partir des réponses passées:Cela exécute toujours la tâche, mais il n'exécute pas ses dépendances:
Celui-ci exécute les dépendances, mais il n'exécute la tâche que si elle n'a pas déjà été invoquée:
Cela réinitialise d'abord l'état déjà invoqué de la tâche, permettant à la tâche d'être à nouveau exécutée, les dépendances et tout:
Notez que les dépendances déjà invoquées ne sont pas automatiquement réexécutées sauf si elles sont réactivées. Dans Rake> = 10.3.2, vous pouvez également utiliser les éléments suivants pour les réactiver:
la source
Rake::Task['db:reset'].invoke
Rake::Task['with:args'].invoke("pizza")
ENV['VERSION'] = '20110408170816'; Rake::Task['db:migrate'].invoke
Voir ici pour plus d'explications.#reenable()
qu'il ne réactivait pas les pré-demandes et en avais besoin. Cet ajout à Rake (> = 10.3.2),#all_prerequisite_tasks()
itérera toutes les tâches, y compris les pré-requis des pré-requis. Donc,Rake::Task[task].all_prerequisite_tasks.each &:reenable
rake db:reset db:migrate
de commande par exemple). Pouvez-vous faire quelque chose comme:Rake::Task["db:reset", "db:migrate"].invoke
par exemple:
la source
Cela devrait vous trier, j'avais juste besoin de la même chose moi-même.
la source
la source
la source
Si vous souhaitez que chaque tâche s'exécute indépendamment des échecs, vous pouvez faire quelque chose comme:
la source
Je suggérerais de ne pas créer de tâches générales de débogage et de publication si le projet est vraiment quelque chose qui est compilé et qui se traduit donc par des fichiers. Vous devriez aller avec des tâches de fichier, ce qui est tout à fait faisable dans votre exemple, comme vous le dites, que votre sortie va dans différents répertoires. Supposons que votre projet compile simplement un fichier test.c vers out / debug / test.out et out / release / test.out avec gcc, vous pouvez configurer votre projet comme ceci:
Cette configuration peut être utilisée comme:
Cela fait un peu plus comme demandé, mais montre mes points:
la source