如何在Gradle中惰性地获取主源集

如何在Gradle中惰性地获取主源集,gradle,gradle-kotlin-dsl,Gradle,Gradle Kotlin Dsl,我需要为所有子项目配置源jar。我定义了以下子项目配置: subprojects { apply(plugin = "java-library") val sourcesJar = tasks.registering(Jar::class) { archiveClassifier.set("sources") from(the<SourceSetContainer>().named("main").get().allJava)

我需要为所有子项目配置源jar。我定义了以下
子项目
配置:

subprojects {
    apply(plugin = "java-library")

    val sourcesJar = tasks.registering(Jar::class) {
        archiveClassifier.set("sources")
        from(the<SourceSetContainer>().named("main").get().allJava)
    }
    tasks.named("assemble") {
        dependsOn(sourcesJar)
    }
}
子项目{
应用(plugin=“java库”)
val sourcesJar=tasks.registing(Jar::class){
archiveClassifier.set(“源”)
from(名为(“main”).get().allJava的()
}
任务。命名为(“汇编”){
dependsOn(sourcesJar)
}
}
当我尝试运行
/gradlew tasks
时,我在子项目中收到一个异常,表示:

“SourceSetContainer”类型的扩展不存在。当前注册的扩展类型:[ExtraPropertiesExtension]

我的假设是,对扩展的
get()
方法的访问会导致问题,但如果没有问题,我就无法引用所需的
allJava
源代码。那么,如何通过使用配置避免API来实现期望的结果呢


使用Kotlin DSL在Gradle 5.2.1上运行。

我找到了可行的解决方案。问题是,当调用
函数时()
是从
任务
类型中提取的,这就是它抱怨缺少扩展的原因。解决方案是在
project
实例上调用
函数()
,如下所示:

subprojects {
  apply {
    plugin<JavaLibraryPlugin>()
  }
  val sourcesJar by tasks.registering(Jar::class) {
    archiveClassifier.set("sources")
    from(
      // take extension from project instance
      project.the<SourceSetContainer>().named("main").get().allJava
    )
  }
}
子项目{
申请{
插件()
}
val sourcesJar by tasks.registing(Jar::class){
archiveClassifier.set(“源”)
从(
//从项目实例获取扩展
project.the().named(“main”).get().allJava
)
}
}