web-dev-qa-db-fra.com

Comprendre la syntaxe groovy dans une définition de tâche gradle

Je suis nouveau chez Gradle et Groovy et j'essaie de comprendre ce qui se passe au niveau du groovy lorsqu'une tâche gradle est définie.

task hello  { 
   println "configuring task hello" 
   doLast {
     println "hello there" 
   }
}

En lisant le livre "Gradle In Action", je sais que le task hello {} Est vraiment un appel à la méthode task() de l'interface groovy Project. Sur la page 77, il montre qu'il existe 4 méthodes appelées tâche sur l'interface Project

task(args: Map<String,?>, name:String)
task(args: Map<String,?>, name:String, c:Closure)
task(name: String)
task(name: String, c:Closure)

Je comprends que le {} Est le corps de fermeture.

Ce que je ne comprends pas, c'est comment groovy interprète hello dans task hello { } Selon https://stackoverflow.com/a/25592665/438319 il y a un groovy plugin du compilateur qui convertit task hello { } en task('hello', { })

Mes questions:

  • Où puis-je trouver des informations sur le plug-in Gradle Groovy Compiler qui effectue la conversion?

  • L'affirmation selon laquelle les scripts Gradle sont des programmes groovy est-elle techniquement incorrecte puisque gradle étend en quelque sorte le langage de programmation Groovy?

  • Existe-t-il un moyen d'obtenir la commande gradle pour imprimer le code groovy de base généré après l'exécution du plugin du compilateur?

72
ams

Gradle utilise Transformations AST pour étendre la syntaxe Groovy. La syntaxe de définition de tâche que vous mentionnez n'est qu'une des transformations appliquées par Gradle. Vous pouvez trouver l'implémentation de cette transformation ici . Pour répondre à vos questions spécifiques:

  • Les transformations individuelles que Gradle applique ne sont pas spécifiquement documentées à ma connaissance. Vous pouvez cependant regarder les autres classes dans le même package du lien ci-dessus.

  • Les scripts Gradle prennent en charge un super-ensemble de syntaxe Groovy. Tout Groovy valide est également valide dans un script Gradle, cependant, un script Gradle n'est pas nécessairement (et généralement pas) un Groovy "par défaut" valide.

  • Il n'y a aucun moyen d'obtenir une sortie du code Groovy équivalent car c'est l'arborescence de syntaxe abstraite réelle qui est manipulée en mémoire.

82
Mark Vieira

Si vous voulez en savoir plus, vérifiez fonction transformVariableExpression dans le code source gradle dans la classe TaskDefinitionScriptTransformer

private void transformVariableExpression(MethodCallExpression call, int index) {
        ArgumentListExpression args = (ArgumentListExpression) call.getArguments();
        VariableExpression arg = (VariableExpression) args.getExpression(index);
        if (!isDynamicVar(arg)) {
            return;
        }

        // Matches: task args?, <identifier>, args? or task(args?, <identifier>, args?)
        // Map to: task(args?, '<identifier>', args?)
        String taskName = arg.getText();
        call.setMethod(new ConstantExpression("task"));
        args.getExpressions().set(index, new ConstantExpression(taskName));
    }

il convertit task args?, <identifier>, args? ou task(args?, <identifier>, args?) en task(args?, '<identifier>', args?) il trouve la définition de la tâche dans le build.gradle et ajoute des guillemets autour de l'identifiant (nom de la tâche) afin que groovy puisse le compiler sans problème.

0
Habib Kazemi