Kotlin Gradle Plugin开发中如何访问Project的sourceSets等扩展?
问题根因
常规build.gradle.kts中可以直接使用sourceSets等扩展,是因为项目已应用Java/Kotlin JVM插件,Gradle Kotlin DSL会为当前项目已应用的插件自动生成类型安全的扩展访问器。而buildSrc模块开发插件时属于编译期,默认不会生成这些针对第三方插件的扩展访问器,因此编译时无法识别sourceSets方法。
解决方法1:使用强类型API直接获取扩展(兼容性最好)
不需要调整buildSrc的依赖配置,直接通过Gradle原生API获取sourceSets容器即可:
import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.SourceSetContainer import org.gradle.kotlin.dsl.* class ExamplePlugin : Plugin<Project> { override fun apply(target: Project) { // 如果目标项目未应用Java/Kotlin插件,先添加插件应用逻辑 target.pluginManager.apply("org.jetbrains.kotlin.jvm") // 写法1:直接获取SourceSet容器配置 val sourceSets = target.extensions.getByType(SourceSetContainer::class.java) sourceSets.configureEach { // 通用配置逻辑 } // 写法2:使用Kotlin DSL提供的the()扩展,支持闭包写法,和原生DSL体验一致 target.the<SourceSetContainer> { main { java.srcDir("src/generated/kotlin") } test { resources.srcDir("src/test/fixtures") } } } }
解决方法2:生成扩展访问器,直接使用原生DSL写法
如果要和普通构建脚本一样写target.sourceSets {}样式的代码,只需要调整buildSrc的配置,触发Kotlin DSL编译器生成对应插件的扩展访问器即可:
第一步:修改buildSrc/build.gradle.kts配置
plugins { `kotlin-dsl` // 把需要用到扩展的插件声明在这里,加apply false即可,不需要实际应用到buildSrc本身 id("org.jetbrains.kotlin.jvm") version "1.5.31" apply false } repositories { mavenCentral() gradlePluginPortal() } dependencies { implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31") } kotlinDsl { jvmTarget = "1.8" }
第二步:重新同步Gradle项目
同步完成后,你原有的target.sourceSets {}代码就可以正常编译运行。
内容的提问来源于stack exchange,提问作者Jire
相关产品推荐
相关产品推荐

