Uma tarefa personalizada em Gradle

Uma tarefa personalizada em Gradle

1. Visão geral

Neste artigo, vamos cobrir comocreate a custom task in Gradle. Mostraremos uma nova definição de tarefa usando um script de construção ou um tipo de tarefa personalizada.

Para obter a introdução ao Gradle, consultethis article. Ele contém os princípios básicos do Gradle e - o que é o mais importante para este artigo - a introdução às tarefas do Gradle.

2. Definição de tarefa personalizada dentro debuild.gradle

Para criar uma tarefa simples do Gradle, precisamos adicionar sua definição ao nosso arquivobuild.gradle:

task welcome {
    doLast {
        println 'Welcome in the example!'
    }
}

O objetivo principal da tarefa acima é apenas imprimir o texto “Bem-vindo ao exemplo!”. Podemos verificar se estetask is available executando o comandogradle tasks –all:

gradle tasks --all

A tarefa está na lista no grupoOther tasks:

Other tasks
-----------
welcome

Pode ser executado como qualquer outra tarefa Gradle:

gradle welcome

O resultado é o esperado - o “Bem-vindo ao exemplo! mensagem.

Observação: se a opção–all não estiver definida, as tarefas que pertencem à categoria "Outros" não são visíveis. A tarefa Nivelamento personalizado pode pertencer a um grupo diferente de "Outro" e pode conter uma descrição.

3. Definir grupo e descrição

Às vezes, é útil agrupar tarefas por função, para que fiquem visíveis em uma categoria. Podemos rapidamentesetgroup for our custom tasks, just by defining a group property:

task welcome {
    group 'Sample category'
    doLast {
        println 'Welcome on the example!'
    }
}

Agora, quando executamos o comando Gradle para listar todas as tarefas disponíveis (a opção–all não é mais necessária), veremos nossa tarefa no novo grupo:

Sample category tasks
---------------------
welcome

No entanto, também é benéfico para os outros verem pelo que uma tarefa é responsável. Podemoscreate a description que contém informações curtas:

task welcome {
    group 'Sample category'
    description 'Tasks which shows a welcome message'
    doLast {
        println 'Welcome in the example!'
    }
}

Quando imprimimos uma lista das tarefas disponíveis, a saída será a seguinte:

Sample category tasks
---------------------
welcome - Tasks which shows a welcome message

Este tipo de definição de tarefa é denominadoad-hoc definition.

Indo além, é benéfico criar uma tarefa personalizável cuja definição pode ser reutilizada. Abordaremos como criar uma tarefa a partir de um tipo e como disponibilizar algumas personalizações para os usuários dessa tarefa.

4. Defina o tipo de tarefa Gradle embuild.gradle

A tarefa de "boas-vindas" acima não pode ser personalizada, portanto, na maioria dos casos, não é muito útil. Podemos executá-lo, mas se precisarmos em um projeto (ou subprojeto) diferente, precisamos copiar e colar sua definição.

Podemos rapidamenteenable customization of the task by creating a task type. Apenas um tipo de tarefa é definido dentro do script de construção:

class PrintToolVersionTask extends DefaultTask {
    String tool

    @TaskAction
    void printToolVersion() {
        switch (tool) {
            case 'java':
                println System.getProperty("java.version")
                break
            case 'groovy':
                println GroovySystem.version
                break
            default:
                throw new IllegalArgumentException("Unknown tool")
        }
    }
}

Acustom task type is a simple Groovy class which extends DefaultTask - a classe que define a implementação de tarefa padrão. Existem outros tipos de tarefas dos quais podemos estender, mas na maioria dos casos, a classeDefaultTask é a escolha apropriada.

PrintToolVersionTasktask contains tool property which can be customized by instances desta tarefa:

String tool

Podemos adicionar quantas propriedades quisermos - lembre-se de que é apenas um campo simples da classe Groovy.

Além disso, contémmethod annotated with @TaskAction. It defines what this task is doing. Neste exemplo simples, ele imprime a versão do Java ou Groovy instalado - depende do valor do parâmetro fornecido.

Para executar uma tarefa personalizada com base no tipo de tarefa criada, precisamoscreate a new task instance of this type:

task printJavaVersion(type : PrintToolVersionTask) {
    tool 'java'
}

As partes mais importantes são:

  • nossa tarefa é do tipoPrintToolVersionTask, entãowhen executed it’ll trigger the action defined in the method annotated with @TaskAction

  • adicionamos um valor de propriedade de ferramenta personalizada (java) que será usado porPrintToolVersionTask

Quando executamos a tarefa acima, a saída é a esperada (depende da versão Java instalada):

> Task :printJavaVersion
9.0.1

Agora vamos criar uma tarefa que imprime a versão instalada do Groovy:

task printGroovyVersion(type : PrintToolVersionTask) {
    tool 'groovy'
}

Ele usa o mesmo tipo de tarefa que definimos anteriormente, mas possui um valor de propriedade de ferramenta diferente. Quando executamos esta tarefa, ela imprime a versão Groovy:

> Task :printGroovyVersion
2.4.12

If we have not too many custom tasks, then we can define them directly in the build.gradle file (como fizemos acima). No entanto, se houver mais do que alguns, nosso arquivobuild.gradle se tornará difícil de ler e entender.

Felizmente, Gradle fornece algumas soluções para isso.

5. Defina o tipo de tarefa na pastabuildSrc

Podemosdefine task types in the buildSrc folder which is located at the root project level. Gradle compila tudo o que está dentro e adiciona tipos ao caminho de classe para que nosso script de construção possa usá-lo.

Nosso tipo de tarefa que definimos antes (PrintToolVersionTask) pode ser movido parabuildSrc/src/main/groovy/com/example/PrintToolVersionTask.groovy. Temos que adicionar apenas algunsimports from Gradle API em uma classe movida.

Podemos definir um número ilimitado de tipos de tarefas na pastabuildSrc. É mais fácil manter, ler e a declaração do tipo de tarefa não está no mesmo lugar que a instanciação da tarefa.

Podemos usar esses tipos da mesma maneira que usamos tipos definidos diretamente no script de construção. Temos que lembrar apenas para adicionar importações apropriadas.

6. Defina o tipo de tarefa no plug-in

Podemos definir um tipo de tarefa personalizado dentro de um plugin Gradle personalizado. Consultethis article, que descreve como definir um plug-in Gradle personalizado, definido em:

  • build.gradle arquivo

  • PastabuildSrc como outras classes Groovy

Essas tarefas personalizadas estarão disponíveis para nossa compilação quando definirmos uma dependência para este plug-in. Observe que tarefas ad-hoc também estão disponíveis - não apenas tipos de tarefas personalizadas.

7. Conclusão

Neste tutorial, abordamos como criar uma tarefa personalizada no Gradle. Existem vários plug-ins disponíveis que você pode usar em seu arquivobuild.gradle que fornecerão muitos tipos de tarefas personalizadas de que você precisa.

Como sempre, trechos de código estão disponíveisover on Github.