Eu tenho um Rakefile que compila o projeto de duas maneiras, de acordo com a variável global $build_type
, que pode ser :debug
ou :release
(os resultados vão em diretórios separados):
task :build => [:some_other_tasks] do
end
Desejo criar uma tarefa que compila o projeto com as duas configurações, algo como isto:
task :build_all do
[ :debug, :release ].each do |t|
$build_type = t
# call task :build with all the tasks it depends on (?)
end
end
Existe uma maneira de chamar uma tarefa como se fosse um método? Ou como posso conseguir algo semelhante?
Rake::Task["build"].invoke
pode ter muito mais desempenho do que usarsystem rake build
porque não precisa criar um novo thread e carregar o ambiente Rails, o quesystem rake build
precisa ser feito.Respostas:
Se você precisa que a tarefa se comporte como um método, que tal usar um método real?
Se você preferir manter
rake
o idioma, aqui estão suas possibilidades, compiladas a partir de respostas anteriores:Isso sempre executa a tarefa, mas não executa suas dependências:
Este executa as dependências, mas somente executa a tarefa se ainda não tiver sido chamado:
Isso primeiro redefine o estado já_invocado da tarefa, permitindo que a tarefa seja executada novamente, dependências e tudo:
Observe que as dependências já invocadas não são reexecutadas automaticamente, a menos que sejam reativadas. No Rake> = 10.3.2, você pode usar o seguinte para reativá-los também:
fonte
Rake::Task['db:reset'].invoke
Rake::Task['with:args'].invoke("pizza")
ENV['VERSION'] = '20110408170816'; Rake::Task['db:migrate'].invoke
Veja aqui para mais explicações.#reenable()
que não reativa o pré-requisito e precisava dele. Esta adição ao Rake (> = 10.3.2),#all_prerequisite_tasks()
iterará todas as tarefas, incluindo pré-requisições de pré-requisições. Então,Rake::Task[task].all_prerequisite_tasks.each &:reenable
rake db:reset db:migrate
de comando, por exemplo). Você pode fazer algo parecido com:Rake::Task["db:reset", "db:migrate"].invoke
por exemplo:
fonte
Isso deveria resolver você, só precisava da mesma coisa.
fonte
fonte
fonte
Se você deseja que cada tarefa seja executada independentemente de qualquer falha, você pode fazer algo como:
fonte
Eu sugeriria não criar tarefas gerais de depuração e lançamento, se o projeto for realmente algo compilado e resultar em arquivos. Você deve executar tarefas de arquivo, o que é bastante factível no seu exemplo, como você afirma, que sua saída entra em diretórios diferentes. Digamos que seu projeto compila apenas um arquivo test.c para out / debug / test.out e out / release / test.out com o gcc, você pode configurar seu projeto assim:
Essa configuração pode ser usada como:
Isso faz um pouco mais, conforme solicitado, mas mostra meus pontos:
fonte