Tarea predeterminada para el espacio de nombres en Rake

88

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 :allsea ​​la tarea predeterminada, de modo que la ejecución la rake my_tasksllame (en lugar de tener que llamar rake my_tasks:all)?

Helder S Ribeiro
fuente
¿Ha intentado poner un valor predeterminado en el espacio de nombres (tarea: predeterminado =>: todos)
Jim Deville
Haga lo que Jim describe, solo la tarea predeterminada sale del espacio de nombres y debe incluir el espacio de nombres y el nombre de la tarea. (task: default => "my_tasks: all") Vea mi respuesta a continuación para ver un ejemplo de trabajo.
Randy Eppinger

Respuestas:

87

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'

Szymon Lipiński
fuente
4
Eso solo lo hace disponible para ser llamado como rake all. En este caso, tengo otros espacios de nombres, así que lo que quiero es poder llamar a la tarea my_tasks:allcomo rake my_tasks, no como rake all.
Helder S Ribeiro
53
entonces solo usa: task: my_tasks => ["my_tasks: foo", "my_tasks: bar"]
Szymon Lipiński
2
Votado a favor del comentario de Simon, había olvidado que así es como lo hago.
Jim Deville
52

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

rake my_task
Shyam Habarakada
fuente
3
esto es genial y cubre todos los requisitos establecidos en la pregunta.
Ivar
1
Creo que la invocación es demasiado complicada y debería ser solo dependencias de tareas:task :my_task => ['my_task:foo', 'my_task:bar']
Alexander Presber
8

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:

rake my_tasks

Con esto, no necesita preocuparse por cambiar su: todas las tareas cuando agrega nuevas tareas en ese espacio de nombres.

Rocoso
fuente
3

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:

rake

Ejecuta la tarea predeterminada, que ejecuta pruebas rápidas y lentas.

Aprendí esto del blog de Cheezy .

Randy Eppinger
fuente
3

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.

zor-el
fuente
1

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.

tvw
fuente
0

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_tasksevitando la incómoda invocación de las subtareas.

Alexander Presber
fuente