Grundlegendes zur groovigen Syntax in einer Gradle-Task-Definition

78

Ich bin neu bei Gradle and Groovy und versuche zu verstehen, was auf der Ebene von Groovy passiert, wenn eine Gradle-Aufgabe definiert wird.

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

Durch das Lesen des Buches "Gradle In Action" weiß ich, dass dies task hello {}wirklich ein Aufruf an die task()Methode der groovigen ProjectOberfläche ist. Auf Seite 77 wird gezeigt, dass die ProjectSchnittstelle 4 Methoden enthält, die als Task bezeichnet werden

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

Ich verstehe, dass das {}der Verschlusskörper ist.

Was ich nicht verstehe ist , wie stark zu interpretieren tut helloin task hello { }nach https://stackoverflow.com/a/25592665/438319 gibt es ein starkes Compiler - Plugin , dass Konvertiten task hello { }intask('hello', { })

Meine Fragen:

  • Wo finde ich Informationen zum Gradle Groovy Compiler-Plugin, das die Konvertierung durchführt?

  • Ist die Behauptung, dass Gradle-Skripte groovige Programme sind, technisch falsch, da gradle die Programmiersprache Groovy irgendwie erweitert?

  • Gibt es eine Möglichkeit, den gradleBefehl zum Ausdrucken des Basis-Groovy-Codes zu erhalten, der nach dem Ausführen des Compiler-Plugins generiert wird?

ams
quelle

Antworten:

84

Gradle verwendet AST-Transformationen , um die Groovy-Syntax zu erweitern. Die von Ihnen erwähnte Aufgabendefinitionssyntax ist nur eine der Transformationen, die Gradle anwendet. Die Implementierung für diese Transformation finden Sie hier . So beantworten Sie Ihre spezifischen Fragen:

  • Die einzelnen Transformationen, die Gradle anwendet, sind an keiner mir bekannten Stelle spezifisch dokumentiert. Sie können sich jedoch die anderen Klassen im selben Paket des obigen Links ansehen.

  • Gradle-Skripte unterstützen eine Vielzahl von Groovy-Syntaxen. Jeder gültige Groovy ist auch in einem Gradle-Skript gültig. Ein Gradle-Skript ist jedoch nicht unbedingt (und normalerweise nicht) ein gültiger "Standard"-Groovy.

  • Es gibt keine Möglichkeit, eine Ausgabe des entsprechenden Groovy-Codes zu erhalten, da der eigentliche abstrakte Syntaxbaum im Speicher bearbeitet wird.

Mark Vieira
quelle
3

Wenn Sie mehr darüber erfahren möchten, überprüfen Sie die Funktion transformVariableExpression im Gradle-Quellcode in der TaskDefinitionScriptTransformerKlasse

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));
    }

es wandelt task args?, <identifier>, args?oder task(args?, <identifier>, args?)zu task(args?, '<identifier>', args?) der Aufgabendefinition in den build.gradle und Add Anführungszeichen um den Bezeichner (Aufgabennamen) findet so groovy es problemlos zusammenstellen kann.

Habib Kazemi
quelle