Groovy转Kotlin DSL:JacocoReport任务代码转换求助
Groovy转Kotlin DSL:JacocoReport任务获取子项目源码目录问题
原Groovy代码
task testz(type: JacocoReport) { additionalSourceDirs.setFrom files(subprojects.sourceSets.main.allSource.srcDirs) }
尝试的Kotlin代码及报错
尝试的代码:
additionalSourceDirs.setFrom(files(subprojects { project.the<SourceSetContainer>().getByName("main").allSource.srcDirs }))
报错信息(翻译后):
类型为'SourceSetContainer'的扩展不存在。当前已注册的扩展类型:[ExtraPropertiesExtension]
正确的Kotlin DSL实现
问题核心是子项目未应用Java相关插件,SourceSetContainer是Java插件提供的扩展,未应用插件时无法获取。以下是两种可靠的实现方式:
方式一:先判断插件是否存在
tasks.register<JacocoReport>("testz") { additionalSourceDirs.setFrom( subprojects.flatMap { subproject -> // 仅处理已应用Java插件的子项目 if (subproject.plugins.hasPlugin("java")) { subproject.sourceSets.main.get().allSource.srcDirs } else { emptyList() } } ) }
方式二:用异常捕获兼容无Java插件的子项目
tasks.register<JacocoReport>("testz") { additionalSourceDirs.setFrom( files( subprojects.mapNotNull { subproject -> // 尝试获取源码集,失败则返回null过滤掉 runCatching { subproject.the<SourceSetContainer>()["main"].allSource.srcDirs }.getOrNull() } ) ) }
补充说明
- Groovy中
subprojects.sourceSets.main会自动遍历所有子项目并获取main源码集,但Kotlin DSL需要更明确的遍历和空安全处理 - 必须确保子项目应用了
java、java-library或其他包含源码集的插件,否则无法获取sourceSets
内容的提问来源于stack exchange,提问作者user15076617
相关产品推荐
相关产品推荐

