如何延迟获取 Gradle 中的主要 sourceSets

How to lazily get main sourceSets in Gradle

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

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)
    }
}

当我尝试 运行 ./gradlew tasks 时,我在我的子项目中收到一个异常:

Extension of type 'SourceSetContainer' does not exist. Currently registered extension types: [ExtraPropertiesExtension]

我的假设是访问扩展的 get() 方法会导致问题,但如果没有它,我将无法引用我需要的 allJava 来源。那么如何使用配置规避来达到预期的效果呢API?

运行 Gradle 5.2.1 with Kotlin DSL。

我找到了可行的解决方案。问题是,当您调用 the<T>() 函数时,它是从 Task 类型中获取的,这就是它抱怨缺少扩展名的原因。解决方案是像这样在 project 实例上调用 the<T>() 函数:

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
    )
  }
}