如何将SonarQube Gradle插件Groovy配置转为Kotlin DSL并解决路径问题
问题:将Jacoco+SonarQube的Groovy配置转换为Kotlin DSL时出现"Unresolved reference: reports"错误
原Groovy配置
jacocoTestReport { reports { xml.enabled true xml.destination(file("${jacoco.reportsDir}/my-tests/jacocoMyTestReport.xml")) } } sonarqube { properties { property "sonar.coverage.jacoco.xmlReportPaths", jacocoTestReport.reports.xml.destination } }
错误的Kotlin尝试代码
sonarqube { properties { property("sonar.coverage.jacoco.xmlReportPaths", tasks.named<JacocoReport>("jacocoTestReport").reports.xml.destination) } }
执行上述代码时触发错误:Unresolved reference: reports
问题原因
tasks.named<JacocoReport>("jacocoTestReport")返回的是**TaskProvider<JacocoReport>**类型,它是Gradle用于延迟任务配置的代理对象,并非直接的JacocoReport实例,因此无法直接访问.reports属性。Groovy允许隐式从TaskProvider获取任务实例,但Kotlin DSL要求显式处理延迟求值逻辑。
正确的Kotlin DSL实现
方式1:使用map延迟获取属性值
tasks.jacocoTestReport { reports { xml.isEnabled = true xml.destination = file("${jacoco.reportsDir}/my-tests/jacocoMyTestReport.xml") } } sonarqube { properties { val jacocoReport = tasks.named<JacocoReport>("jacocoTestReport") property("sonar.coverage.jacoco.xmlReportPaths", jacocoReport.map { it.reports.xml.destination }) } }
方式2:结合lazy延迟获取实例属性
如果jacocoTestReport任务已由插件自动创建,也可以直接通过任务引用结合lazy处理:
tasks.jacocoTestReport { reports { xml.isEnabled = true xml.destination = file("${jacoco.reportsDir}/my-tests/jacocoMyTestReport.xml") } } sonarqube { properties { property("sonar.coverage.jacoco.xmlReportPaths", lazy { tasks.jacocoTestReport.get().reports.xml.destination }) } }
内容的提问来源于stack exchange,提问作者Kolargol00
相关产品推荐
相关产品推荐

