Как условно принять условия обслуживания плагина Gradle build scan в Kotlin DSL?
Это в основном расширяет этот вопрос на Kotlin DSL вместо Groovy DSL:
Как работает Groovy DSL решение
if (hasProperty('buildScan')) {
buildScan {
termsOfServiceUrl = 'https://gradle.com/terms-of-service'
termsOfServiceAgree = 'yes'
}
}
перевести на котлин 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
не решить, однако я не знаю, какой синтаксис использовать здесь.
1 ответ
Это не совсем хорошо, но с помощью отражения это работает:
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")
}
}
The Gradle Kotlin DSL provides a withGroovyBuilder {}
utility extension that attaches the Groovy metaprogramming semantics to any object. See the official documentation.
extensions.findByName("buildScan")?.withGroovyBuilder {
setProperty("termsOfServiceUrl", "https://gradle.com/terms-of-service")
setProperty("termsOfServiceAgree", "yes")
}
This ends up doing reflection, just like Groovy, but it keeps the script a bit more tidy.