Est-il possible dans une tâche rake d'obtenir une liste de tâches dans un espace de noms? Une sorte de "rake" -T db?Est-il possible d'obtenir une liste de toutes les tâches de rake disponibles dans un espace de noms?
Q
Est-il possible d'obtenir une liste de toutes les tâches de rake disponibles dans un espace de noms?
18
A
Répondre
16
J'ai trouvé la réponse:
tasks = Rake.application.tasks
Cela retourne un tableau de Rake :: objets Tâche qui peuvent être examinés. De plus amples détails à http://rake.rubyforge.org/
1
Vous pouvez utiliser la commande grep comme celui-ci
desc 'Test'
task :test do
# You can change db: by any other namespaces
result = %x[rake -T | sed -n '/db:/{/grep/!p;}' | awk '{print$2}']
result.each_line do |t|
puts t # Where t is your task name
end
end
11
Comme vous l'avez écrit, avec Rake.application.tasks vous obtenez toutes les tâches.
Mais l'intérieur de l'espace de noms, vous pouvez sélectionner uniquement les tâches de l'espace de noms (tâche mytest: tasklist)
Et vous pouvez limiter les tâches à un espace de noms (tâche tasklist_mytest).
require 'rake'
namespace :mytest do |ns|
task :foo do |t|
puts "You called task #{t}"
end
task :bar do |t|
puts "You called task #{t}"
end
desc 'Get tasks inside actual namespace'
task :tasklist do
puts 'All tasks of "mytest":'
puts ns.tasks #ns is defined as block-argument
end
end
desc 'Get all tasks'
task :tasklist do
puts 'All tasks:'
puts Rake.application.tasks
end
desc 'Get tasks outside the namespace'
task :tasklist_mytest do
puts 'All tasks of "mytest":'
Rake.application.in_namespace(:mytest){|x|
puts x.tasks
}
end
if $0 == __FILE__
Rake.application['tasklist'].invoke() #all tasks
Rake.application['mytest:tasklist'].invoke() #tasks of mytest
Rake.application['tasklist_mytest'].invoke() #tasks of mytest
end
Pour autant que je l'ai vu, il n'y a pas d'aide pour trouver des choses dans un champ, mais je pense que cela devrait être assez facile: Rake.application.tasks.reject {| tâche | task.scope! = [: your,: scope]} – phoet
Dans mon cas (Rails), il était également nécessaire d'exécuter 'AppName :: Application.load_tasks' pour remplir' Rake.application.tasks' – joshfindit