Quando eu estava escrevendo uma tarefa no Capistrano3, tive dificuldade em obter o nome da tarefa de nível superior porque tive dificuldade em conseguir o nome da tarefa de nível superior executada como um comando cap na tarefa.
Basicamente, se você quiser colocar o nome da tarefa em uma tarefa no Capistrano3, pode desenhá-lo como um argumento para o bloco da seguinte forma:
DESĆ "Tarefa Principal"
tarefa :main_task => :sub_task fazer |tarefa|
run_locally
info ": Nome desta tarefa: #{tarefa}"
info ": Executando a tarefa principal de implantação!"
fim
fim
descer "subtarefa"
tarefa :sub_task fazer |tarefa|
run_locally
current_task = task.name_with_args.split(':').last
info ": Nome desta tarefa: #{current_task}"
fim
fim
Quando você realiza a tarefa acima, fica assim.
$ Teste de Implantação do Cap main_task
INFO: Nome desta tarefa: sub_task
INFO: Nome desta tarefa: deploy:main_task
INFO: Executando a tarefa principal de deploy!
No entanto, se você criar uma subtarefa que leia a configuração comum da implantação e construir uma cadeia de tarefas que execute a subtarefa antes de todas as tarefas principais, e quiser ramificar algumas subtarefas apenas quando uma tarefa principal específica for executada, precisará obter o nome da tarefa principal dentro da subtarefa. Em outras palavras, eu queria executar a tarefa de nível superior (a tarefa principal no exemplo) pelo comando cap, mas tive dificuldade para encontrar os TIPS para isso. O processamento de tarefas do Capistrano é implementado na classe Rake usada no núcleo, então tive que obtê-lo pelo método Application dessa classe Rake.
Exemplo de uma subtarefa que pegou uma tarefa de nível superior e a ramificou:
desc "tarefa principal1 : inicializar"
tarefa :initialize => :set_options fazer
run_locally
info ": Iniciando inicialização para implantação"
fim
fim
DESC "Tarefa Principal2 : Implantação"
tarefa :d eployment => :set_options fazer
run_locally
info ": Executando deploy de aplicação!"
fim
fim
DESC "Subtarefa Comum: Definir Opções"
tarefa :set_options fazer |tarefa|
Definir :top_level_task, task.application.top_level_tasks.último.split(':').último
run_locally
info ": Nome da tarefa de nível superior: #{fetch(:top_level_task)}"
se (fetch(:top_level_task) == 'inicializar') então
info ": Se a tarefa principal for chamada inicialize, esta tarefa está sendo executada."
senão
info ": Execute a tarefa no caso da principal tarefa de implantação."
fim
fim
fim
O resultado da tarefa acima é
$ cap teste de implantação: inicializar
INFO: Nome da tarefa de nível superior: inicializar
INFO: Se a tarefa principal for nomeada inicialize, essa tarefa está sendo executada.
INFO: Iniciação para implantação
$ Cap Teste Implantação:Implantação
INFO: Nome principal da tarefa: implantação
INFO: Realize a tarefa no caso da tarefa principal de implantação.
INFO: Executando deploy de aplicativos!
e pode-se ver que o processamento de até mesmo uma subtarefa é diferente porque a tarefa principal (tarefa principal) executada por uma é diferente.
Ao cortar tarefas e torná-las comuns, o método 'Rake::Application.top_level_tasks' é bastante útil.