Dado algo como:
namespace :my_tasks do
task :foo do
do_something
end
task :bar do
do_something_else
end
task :all => [:foo, :bar]
end
¿Cómo hago para que :all
sea la tarea predeterminada, de modo que la ejecución la rake my_tasks
llame (en lugar de tener que llamar rake my_tasks:all
)?
Respuestas:
Colóquelo fuera del espacio de nombres de esta manera:
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"]
Además ... si sus tareas requieren argumentos, entonces:
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
Observe cómo en el segundo ejemplo puede llamar a la tarea con el mismo nombre que el espacio de nombres, es decir, 'my_tasks'
fuente
rake all
. En este caso, tengo otros espacios de nombres, así que lo que quiero es poder llamar a la tareamy_tasks:all
comorake my_tasks
, no comorake all
.No es muy intuitivo, pero puede tener un espacio de nombres y una tarea con el mismo nombre, y eso efectivamente le da lo que desea. Por ejemplo
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
Ahora puedes ejecutar comandos como,
rake my_task:foo
y
fuente
task :my_task => ['my_task:foo', 'my_task:bar']
Le sugiero que use esto si tiene muchas tareas en el espacio de nombres.
task :my_tasks do Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}} end
Y luego puede ejecutar todas las tareas en el espacio de nombres mediante:
Con esto, no necesita preocuparse por cambiar su: todas las tareas cuando agrega nuevas tareas en ese espacio de nombres.
fuente
Yo uso este Rakefile para pepino:
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"
Entonces, si escribo solo:
Ejecuta la tarea predeterminada, que ejecuta pruebas rápidas y lentas.
Aprendí esto del blog de Cheezy .
fuente
La forma en que estoy leyendo la pregunta de obvio171 es que está pidiendo 1) una forma sistemática de invocar una determinada tarea en un espacio de nombres invocando el espacio de nombres como una tarea.
Con frecuencia me he encontrado con la misma necesidad. Me gusta agrupar lógicamente las tareas en espacios de nombres. A menudo, esa agrupación se parece a una jerarquía. De ahí que el deseo de invocar al grupo tenga mucho sentido para mí.
Aquí está mi opinión:
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) ... o preguntaba, hace años. No obstante, una pregunta aún interesante.
fuente
Agregue la siguiente tarea fuera del espacio de nombres:
desc "Run all my tasks" task :my_tasks => ["my_tasks:all"]
Tenga en cuenta que puede tener una tarea con el mismo nombre que el espacio de nombres.
Y aquí hay un ejemplo más grande, que muestra cómo puede hacer uso de las tareas, que tienen el mismo nombre que el espacio de nombres, incluso cuando se anidan espacios de nombres:
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]
Cópialo y pruébalo.
fuente
Basado en la solución de Rocky Tarea predeterminada para el espacio de nombres en Rake
Y la respuesta de este dexter ¿Hay alguna manera de conocer la tarea de rake actual?
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
fuente
Combinando las respuestas de Szymon Lipiński y Shyam Habarakada, aquí está lo que creo que es la respuesta más idiomática y coherente:
namespace :my_tasks do task :foo do do_something end task :bar do do_something_else end end task :my_tasks => ["my_tasks:foo", "my_tasks:bar"]
le permite hacerlo
rake my_tasks
evitando la incómoda invocación de las subtareas.fuente