Можно ли манипулировать метаклассами скрипта gradle, распечатывать все методы, которые вызывает gradle? - PullRequest
0 голосов
/ 24 сентября 2019

Мы бы хотели, чтобы 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.

...