Tarefa padrão para namespace em Rake

87

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

Como faço para tornar :alla tarefa padrão, para que a execução rake my_tasksa chame (ao invés de ter que chamar rake my_tasks:all)?

Helder S Ribeiro
fonte
você tentou colocar um padrão no namespace (tarefa: default =>: all)
Jim Deville
Faça o que Jim descreve, apenas a tarefa padrão sai do namespace e deve incluir o namespace e o nome da tarefa. (tarefa: default => "my_tasks: all") Veja minha resposta abaixo para um exemplo prático.
Randy Eppinger

Respostas:

86

Coloque-o fora do namespace como este:

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"]

Além disso ... se suas tarefas exigem argumentos:

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 como no segundo exemplo você pode chamar a tarefa com o mesmo nome do namespace, ou seja, 'my_tasks'

Szymon Lipiński
fonte
4
Isso apenas o torna disponível para ser chamado de rake all. Nesse caso, tenho outros namespaces, então o que desejo é poder chamar a tarefa my_tasks:allcomo rake my_tasks, não como rake all.
Helder S Ribeiro
53
então use: task: my_tasks => ["my_tasks: foo", "my_tasks: bar"]
Szymon Lipiński
2
Votado a favor do comentário do simon, tinha esquecido que é assim que eu faço.
Jim Deville,
51

Não é muito intuitivo, mas você pode ter um namespace e uma tarefa com o mesmo nome, e isso efetivamente fornece o que você deseja. Por exemplo

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

Agora você pode executar comandos como,

rake my_task:foo

e

rake my_task
Shyam Habarakada
fonte
3
isso é ótimo e cobre todos os requisitos declarados na pergunta.
Ivar
1
Acho que a invocação é muito complicada e deve ser apenas dependências de tarefas:task :my_task => ['my_task:foo', 'my_task:bar']
Alexander Presber
8

Eu sugiro que você use isso se tiver muitas tarefas no namespace.

task :my_tasks do
  Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}}
end

E então você pode executar todas as tarefas no namespace:

rake my_tasks

Com isso, você não precisa se preocupar em alterar sua tarefa: all ao adicionar novas tarefas a esse namespace.

Rochoso
fonte
3

Eu 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"

Então, se eu digitar apenas:

rake

Ele executa a tarefa padrão, que executa testes rápidos e lentos.

Eu aprendi isso de blog de Cheezy .

Randy Eppinger
fonte
3

A maneira como estou lendo a pergunta de obvio171 é que ele está pedindo 1) uma maneira sistemática de invocar uma determinada tarefa em um namespace invocando o namespace como uma tarefa.

Freqüentemente encontrei a mesma necessidade. Gosto de agrupar tarefas logicamente em namespaces. Freqüentemente, esse agrupamento se assemelha a uma hierarquia. Portanto, o desejo de invocar o grupo faz muito sentido para mim.

Aqui está minha opinião:

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 estava perguntando, anos atrás. No entanto, uma questão ainda interessante.

zor-el
fonte
1

Adicione a seguinte tarefa fora do namespace:

desc "Run all my tasks"
task :my_tasks => ["my_tasks:all"]

Lembre-se de que você pode ter uma tarefa com o mesmo nome do namespace.

E aqui está um exemplo maior, que mostra como você pode fazer uso de tarefas, que têm o mesmo nome do namespace, mesmo ao aninhar namespaces:

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]

Apenas copie e experimente.

tvw
fonte
0

Combinando as respostas de Szymon Lipiński e Shyam Habarakada, aqui está o que eu considero a resposta mais idiomática e consistente:

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"]

permite que você faça rake my_tasks, evitando a invocação complicada das subtarefas.

Alexander Presber
fonte