Une tâche personnalisée dans Gradle

Une tâche personnalisée dans Gradle

1. Vue d'ensemble

Dans cet article, nous verrons commentcreate a custom task in Gradle. Nous allons afficher une nouvelle définition de tâche à l'aide d'un script de construction ou d'un type de tâche personnalisé.

Pour une introduction au Gradle, veuillez consulterthis article. Il contient les bases de Gradle et - ce qui est le plus important pour cet article - l'introduction aux tâches de Gradle.

2. Définition de tâche personnalisée dansbuild.gradle

Pour créer une tâche Gradle simple, nous devons ajouter sa définition à notre fichierbuild.gradle:

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

L'objectif principal de la tâche ci-dessus est simplement d'imprimer le texte «Bienvenue dans l'exemple!». Nous pouvons vérifier si cetask is available en exécutant la commandegradle tasks –all:

gradle tasks --all

La tâche est sur la liste sous le groupeOther tasks:

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

Il peut être exécuté comme n'importe quelle autre tâche Gradle:

gradle welcome

Le résultat est comme prévu - le "Bienvenue dans l'exemple!" message.

Remarque: si l’option–all n’est pas définie, les tâches appartenant à la catégorie «Autre» ne sont pas visibles. La tâche de gradation personnalisée peut appartenir à un groupe différent de celui de «Autre» et peut contenir une description.

3. Définir le groupe et la description

Parfois, il est pratique de regrouper les tâches par fonction afin qu’elles soient visibles sous une seule catégorie. On peut rapidementsetgroup for our custom tasks, just by defining a group property:

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

Maintenant, lorsque nous exécutons la commande Gradle pour répertorier toutes les tâches disponibles (l'option–all n'est plus nécessaire), nous verrons notre tâche sous un nouveau groupe:

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

Cependant, il est également avantageux pour les autres de voir de quoi est responsable une tâche. On peutcreate a description qui contient de courtes informations:

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

Lorsque nous imprimons une liste des tâches disponibles, le résultat sera le suivant:

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

Ce type de définition de tâche est appeléad-hoc definition.

Pour aller plus loin, il est avantageux de créer une tâche personnalisable dont la définition peut être réutilisée. Nous verrons comment créer une tâche à partir d'un type et comment rendre une certaine personnalisation disponible pour les utilisateurs de cette tâche.

4. Définir le type de tâche Gradle à l'intérieur debuild.gradle

La tâche «bienvenue» ci-dessus ne peut pas être personnalisée, donc, dans la plupart des cas, elle n’est pas très utile. Nous pouvons l'exécuter, mais si nous en avons besoin dans un projet (ou sous-projet) différent, nous devons copier et coller sa définition.

Nous pouvons rapidementenable customization of the task by creating a task type. Simplement, un type de tâche est défini dans le script de construction:

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 - la classe qui définit l'implémentation de tâche standard. Il existe d'autres types de tâches à partir desquels nous pouvons étendre, mais dans la plupart des cas, la classeDefaultTask est le choix approprié.

PrintToolVersionTasktask contains tool property which can be customized by instances de cette tâche:

String tool

Nous pouvons ajouter autant de propriétés que nous le souhaitons. N'oubliez pas qu'il s'agit simplement d'un champ de classe Groovy.

De plus, il contientmethod annotated with @TaskAction. It defines what this task is doing. Dans cet exemple simple, il affiche la version de Java ou Groovy installée - dépend de la valeur du paramètre donné.

Pour exécuter une tâche personnalisée en fonction du type de tâche créée, nous devonscreate a new task instance of this type:

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

Les parties les plus importantes sont:

  • notre tâche est de typePrintToolVersionTask, doncwhen executed it’ll trigger the action defined in the method annotated with @TaskAction

  • nous avons ajouté une valeur de propriété d'outil personnalisée (java) qui sera utilisée parPrintToolVersionTask

Lorsque nous exécutons la tâche ci-dessus, le résultat est celui attendu (dépend de la version de Java installée):

> Task :printJavaVersion
9.0.1

Créons maintenant une tâche qui imprime la version installée de Groovy:

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

Il utilise le même type de tâche que celui défini précédemment, mais sa valeur de propriété d’outil est différente. Lorsque nous exécutons cette tâche, la version Groovy est imprimée:

> Task :printGroovyVersion
2.4.12

If we have not too many custom tasks, then we can define them directly in the build.gradle file (comme nous l'avons fait ci-dessus). Cependant, s'il y en a plus que quelques-uns, notre fichierbuild.gradle devient difficile à lire et à comprendre.

Heureusement, Gradle fournit des solutions pour cela.

5. Définir le type de tâche dans le dossierbuildSrc

Nous pouvonsdefine task types in the buildSrc folder which is located at the root project level. Gradle compile tout ce qui est à l'intérieur et ajoute des types au classpath afin que notre script de construction puisse l'utiliser.

Notre type de tâche que nous avons défini avant (PrintToolVersionTask) peut être déplacé dans lebuildSrc/src/main/groovy/com/example/PrintToolVersionTask.groovy. Nous devons seulement ajouter quelquesimports from Gradle API dans une classe déplacée.

Nous pouvons définir un nombre illimité de types de tâches dans le dossierbuildSrc. Il est plus facile de gérer, de lire et la déclaration du type de tâche ne se trouve pas au même endroit que l’instanciation de la tâche.

Nous pouvons utiliser ces types de la même manière que nous utilisons les types définis directement dans le script de construction. Nous devons nous rappeler seulement d'ajouter les importations appropriées.

6. Définir le type de tâche dans le plug-in

Nous pouvons définir des types de tâches personnalisés dans un plugin Gradle personnalisé. Veuillez vous référer àthis article, qui décrit comment définir un plugin Gradle personnalisé, défini dans le:

  • Fichierbuild.gradle

  • DossierbuildSrc comme les autres classes Groovy

Ces tâches personnalisées seront disponibles pour notre construction lorsque nous définirons une dépendance à ce plugin. Veuillez noter que les tâches ad-hoc sont également disponibles - pas seulement les types de tâches personnalisées.

7. Conclusion

Dans ce didacticiel, nous avons expliqué comment créer une tâche personnalisée dans Gradle. Il existe de nombreux plugins disponibles que vous pouvez utiliser dans votre fichierbuild.gradle qui vous fourniront de nombreux types de tâches personnalisées dont vous avez besoin.

Comme toujours, des extraits de code sont disponiblesover on Github.