gradle - 如何在 Gradle 中延迟获取主要 sourceSets

标签 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)
    }
    tasks.named("assemble") {
        dependsOn(sourcesJar)
    }
}

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

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

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

使用 Kotlin DSL 在 Gradle 5.2.1 上运行。

最佳答案

我找到了可行的解决方案。问题是当你调用the<T>()时函数取自Task type 这就是它提示缺少扩展的原因。解决办法是调用the<T>()功能于 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
    )
  }
}

关于gradle - 如何在 Gradle 中延迟获取主要 sourceSets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55106664/

相关文章:

gradle - 使用 maven-publish 插件签署 POM 文件

android - 为基于 Android Gradle 的项目配置 Bamboo

Maven项目作为gradle项目的依赖模块

gradle - 如何在Gradle插件中添加对配置的依赖

gradle - 如何在 Gradle Kotlin DSL 中有效地填充额外的属性?

kotlin - 如何使用 Kotlin DSL 选择性地应用一些插件以及使用 gradle 和 android 的插件 block

gradle - 将嵌套的额外属性从.gradle迁移到.gradle.kts(DSL)

Android Studio : Instrument Tests Cannot Find junit, mockito 或 hamcrest

android - 我在android studio中遇到了这个问题。我已经下载了链接中提到的文件,并将其粘贴到哪里

java - Gradle 构建问题 : upgrading Quickblox and httpclient on latest Android SDK23