You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:39:02