Gradle Kotlin DSL配置sourceSets无法清空源码目录问题求助
Gradle Kotlin DSL 清空SourceSet目录失效的原因与解决方法
核心差异:Groovy与Kotlin DSL的赋值逻辑不同
在Groovy DSL中,srcDirs = []本质是调用SourceDirectorySet.setSrcDirs(Iterable)方法,直接替换整个源目录集合,完全覆盖Gradle默认的约定目录(比如src/main/groovy、src/test/java),从而实现清空效果。
而你在Kotlin DSL中使用的srcDirs.clear(),只是清空了当前集合中你显式添加的目录,但Gradle为SourceSet预设的默认目录是通过约定机制绑定的,这部分内容不会被clear()移除,所以最终输出仍会显示默认目录。另外,你尝试的srcDirs(emptyArray())或srcDirs(emptyList())是调用srcDirs()方法,该方法的作用是追加目录而非替换,自然也无法清空默认目录。
正确的Kotlin DSL配置写法
要实现和Groovy DSL完全一致的清空效果,需要显式调用setSrcDirs()方法,传入空集合来替换整个目录集合:
sourceSets { main { kotlin.setSrcDirs(listOf("src/main/java")) groovy.setSrcDirs(emptyList()) } test { java.setSrcDirs(emptyList()) groovy.setSrcDirs(listOf("src/test/java", "src/test/groovy")) } }
验证方式
添加打印语句验证配置结果:
sourceSets { main { kotlin.setSrcDirs(listOf("src/main/java")) groovy.setSrcDirs(emptyList()) println("main kotlin: ${kotlin.srcDirs}") println("main groovy: ${groovy.srcDirs}") } test { java.setSrcDirs(emptyList()) groovy.setSrcDirs(listOf("src/test/java", "src/test/groovy")) println("test java: ${java.srcDirs}") println("test groovy: ${groovy.srcDirs}") } }
执行后会看到对应的源目录已被正确清空,与Groovy DSL的效果完全一致。
内容的提问来源于stack exchange,提问作者Gondri
相关产品推荐
相关产品推荐

