詳細検索

Obtenha nomes de tarefas de nível superior dentro das tarefas do Capistrano 3

Avatar
por maeno
3 min de leitura

Obtenha nomes de tarefas de nível superior dentro das tarefas do Capistrano 3
Traduzido do 日本語 • Ver original

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.

Related Articles