Мы бы хотели, чтобы gradle был более «печатным», например, распечатывая методы, которые вызывает gradle, или подобные вещи.Наша цель - сделать это с помощью Meta-Object-Protocol в Groovy, не касаясь AST или байт-кода напрямую.
Мы пытались манипулировать методом вызова метакласса String (только что выделенного).Проблема в том, что манипулируют только явным классом после манипуляции внутри скрипта gradle.Gradle не вызывает манипулируемые классы.
Мы пробовали декоратор
class TracingDecorator {
private delegate
TracingDecorator(delegate) {
this.delegate = delegate
}
def invokeMethod(String name, args) {
println "Calling $name$args"
def before = System.currentTimeMillis()
def metaMethod = GradleMain.metaClass.getStaticMetaMethod(name, args)
def result = metaMethod.doMethodInvoke(delegate, args)
println delegate.getMetaPropertyValues()
println "Got $result in ${System.currentTimeMillis()-before} ms"
result
}
}
GradleMain gradle = new GradleMain()
def m = new TracingDecorator(gradle);
m.main('-v')
пытались манипулировать метаклассом этого класса.GradleMain является точкой входа cmd gradle
GradleMain.metaClass.invokeMethod = {
String method, Object[] argv ->
println("Called method: $method")
def metaMethod = GradleMain.metaClass.getStaticMetaMethod(method, argv)
def result
if (metaMethod) result = metaMethod.doMethodInvoke(delegate, argv)
else result = "method does not exist"
result
}
Gradle должен вызывать манипулируемые метаклассы и распечатывать каждый вызываемый им метод.В настоящее время это работает внутри самого скрипта gradle, но не для, например, других задач в процессе gradle.