Как условно принять условия обслуживания плагина Gradle build scan в Kotlin DSL? - PullRequest
2 голосов
/ 17 апреля 2019

Это в основном распространяется этот вопрос на Kotlin DSL вместо Groovy DSL:

Как работает решение Groovy DSL из

if (hasProperty('buildScan')) {
    buildScan {
        termsOfServiceUrl = 'https://gradle.com/terms-of-service'
        termsOfServiceAgree = 'yes'
    }
}

перевести на Kotlin DSL?

Проблема, с которой я работаю, состоит в том, что расширение "buildScan" или класс com.gradle.scan.plugin.BuildScanExtension не могут использоваться статически, так как они присутствуют или отсутствуют, в зависимости от того, есть ли команда --scanСтроковый аргумент был предоставлен Gradle или нет.

Я пробовал

if (hasProperty("buildScan")) {
    extensions.configure("buildScan") {
        termsOfServiceUrl = "https://gradle.com/terms-of-service"
        termsOfServiceAgree = "yes"
    }
}

, но, как и ожидалось, termsOfServiceUrl и termsOfServiceAgree не разрешаются, однако я не знаю, какой синтаксис здесь использовать.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Это не совсем хорошо, но с помощью отражения это работает:

if (hasProperty("buildScan")) {
    extensions.configure("buildScan") {
        val setTermsOfServiceUrl = javaClass.getMethod("setTermsOfServiceUrl", String::class.java)
        setTermsOfServiceUrl.invoke(this, "https://gradle.com/terms-of-service")

        val setTermsOfServiceAgree = javaClass.getMethod("setTermsOfServiceAgree", String::class.java)
        setTermsOfServiceAgree.invoke(this, "yes")
    }
}
1 голос
/ 17 июня 2019

Gradle Kotlin DSL предоставляет расширение withGroovyBuilder {}, которое присоединяет семантику метапрограммирования Groovy к любому объекту. См. официальную документацию .

extensions.findByName("buildScan")?.withGroovyBuilder {
  setProperty("termsOfServiceUrl", "https://gradle.com/terms-of-service")
  setProperty("termsOfServiceAgree", "yes")
}

Это в конечном итоге делает отражение, как в Groovy, но делает скрипт немного более аккуратным.

...