9

这基本上将这个问题扩展到 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"
    }
}

但正如预期的那样termsOfServiceUrltermsOfServiceAgree没有解决,但是我不知道在这里使用什么语法。

4

2 回答 2

8

Gradle Kotlin DSL 提供了一个withGroovyBuilder {}实用扩展,可将 Groovy 元编程语义附加到任何对象。见官方文档

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

这最终会进行反射,就像 Groovy 一样,但它使脚本更加整洁。

于 2019-06-17T15:42:26.723 回答
2

这不是很好,但使用反射它可以工作:

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")
    }
}
于 2019-04-17T11:18:50.150 回答