Étant donné quelque chose comme:
namespace :my_tasks do
task :foo do
do_something
end
task :bar do
do_something_else
end
task :all => [:foo, :bar]
end
Comment puis-je faire :all
être la tâche par défaut, de sorte que l'exécution de rake my_tasks
l'appellera (au lieu d'avoir à appeler rake my_tasks:all
)?
Placez-le en dehors de l'espace de noms comme ceci:
namespace :my_tasks do
task :foo do
do_something
end
task :bar do
do_something_else
end
end
task :all => ["my_tasks:foo", "my_tasks:bar"]
Aussi ... si vos tâches nécessitent des arguments alors:
namespace :my_tasks do
task :foo, :arg1, :arg2 do |t, args|
do_something
end
task :bar, :arg1, :arg2 do |t, args|
do_something_else
end
end
task :my_tasks, :arg1, :arg2 do |t, args|
Rake::Task["my_tasks:foo"].invoke( args.arg1, args.arg2 )
Rake::Task["my_tasks:bar"].invoke( args.arg1, args.arg2 )
end
Remarquez comment, dans le deuxième exemple, vous pouvez appeler la tâche du même nom que l'espace de noms, c'est-à-dire 'mes_tâches'
Pas très intuitif, mais vous pouvez avoir un espace de noms et une tâche qui ont le même nom, et qui vous donnent effectivement ce que vous voulez. Par exemple
namespace :my_task do
task :foo do
do_foo
end
task :bar do
do_bar
end
end
task :my_task do
Rake::Task['my_task:foo'].invoke
Rake::Task['my_task:bar'].invoke
end
Vous pouvez maintenant exécuter des commandes comme,
rake my_task:foo
et
rake my_task
Je vous suggère de l'utiliser si vous avez beaucoup de tâches dans l'espace de noms.
task :my_tasks do
Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}}
end
Et puis vous pouvez exécuter toutes les tâches dans l'espace de noms en:
rake my_tasks
Avec cela, vous n'avez pas à vous soucier de changer votre tâche: all lorsque vous ajoutez de nouvelles tâches dans cet espace de noms.
J'utilise ce Rakefile pour le concombre:
require 'cucumber'
require 'cucumber/rake/task'
namespace :features do
Cucumber::Rake::Task.new(:fast) do |t|
t.profile = 'fast'
end
Cucumber::Rake::Task.new(:slow) do |t|
t.profile = 'slow'
end
task :ci => [:fast, :slow]
end
task :default => "features:ci"
Alors si je tape juste:
rake
Il exécute la tâche par défaut, qui exécute des tests rapides et lents.
J'ai appris ceci de le blog de Cheezy .
La façon dont je lis la question de obvio171 est qu'il demande1) pour un moyen systématique d'invoquer une certaine tâche dans un espace de noms en appelant l'espace de noms en tant que tâche.
J'ai souvent rencontré le même besoin. J'aime grouper logiquement les tâches dans des espaces de noms. Ce regroupement ressemble souvent à une hiérarchie. Par conséquent, le désir d'invoquer le groupe est très logique pour moi.
Voici mon point de vue. Laissez-moi savoir ce que vous pensez.
module Rake::DSL
def group(name, &block)
ns = namespace name, &block
default = ns[:default]
task name => "#{name}:default" if default
ns
end
end
group :foo do
task :foo1 do |t| puts t.name end
task :foo2 do |t| puts t.name end
task :default => [:foo1, :foo2]
end
task :default => :foo
1)... ou demandais, il y a des années. Néanmoins, une question encore intéressante.
Ajoutez la tâche suivante en dehors de l'espace de noms:
desc "Run all my tasks"
task :my_tasks => ["my_tasks:all"]
Gardez à l'esprit que vous pouvez avoir une tâche avec le même nom que l'espace de noms.
Et un plus gros exemple, qui montre comment vous pouvez utiliser des tâches qui ont le même nom que l'espace de noms, même lors de l'imbrication des espaces de noms:
namespace :job1 do
task :do_something1 do
puts "job1:do_something1"
end
task :do_something2 do
puts "job1:do_something2"
end
task :all => [:do_something1, :do_something2]
end
desc "Job 1"
task :job1 => ["job1:all"]
# You do not need the "all"-task, but it might be handier to have one.
namespace :job2 do
task :do_something1 do
puts "job2:do_something1"
end
task :do_something2 do
puts "job2:do_something2"
end
end
desc "Job 2"
task :job2 => ["job2:do_something1", "job2:do_something2"]
namespace :superjob do
namespace :job1 do
task :do_something1 do
puts "superjob:job1:do_something1"
end
task :do_something2 do
puts "superjob:job1:do_something2"
end
end
desc "Job 1 in Superjob"
task :job1 => ["job1:do_something1", "job1:do_something2"]
namespace :job2 do
task :do_something1 do
puts "superjob:job2:do_something1"
end
task :do_something2 do
puts "superjob:job2:do_something2"
end
end
desc "Job 2 in Superjob"
task :job2 => ["job2:do_something1", "job2:do_something2"]
end
desc "My Super Job"
task :superjob => ["superjob:job1", "superjob:job2"]
# Do them all just by calling "$ rake"
task :default => [:job1, :job2, :superjob]
Il suffit de le copier et de l'essayer.
Basé sur la solution de Rocky tâche par défaut pour l'espace de noms dans Rake
Et la réponse de ce dextre Existe-t-il un moyen de connaître la tâche de râteau actuelle?
namespace :root do
namespace :foo do
end
namespace :target do
task :all do |task_all|
Rake.application.in_namespace(task_all.scope.path) do |ns|
ns.tasks.each { |task| task.invoke unless task.name == task_all.name }
end
end
task :one do
end
task :another do
end
end
end