swagger 如何在现有Gradle任务上声明额外的依赖项?

yks3o0rb  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(69)

Gradle 8.1(Android Studio Giraffe)要求任务之间存在显式或隐式依赖关系。如果我生成的资源将由Android Gradle插件打包,并带有i.e.一些OpenAPI工具,我不明白如何根据Gradle提供的提示来增强Android Gradle插件拥有的现有Gradle任务:

Possible solutions:
  1. Declare task ':app:generateOpenApiFooBar' as an input of ':app:packageDebugResources'.
  2. Declare an explicit dependency on ':app:generateOpenApiFooBar' from ':app:packageDebugResources' using Task#dependsOn.
  3. Declare an explicit dependency on ':app:generateOpenApiFooBar' from ':app:packageDebugResources' using Task#mustRunAfter.

有没有一种方法可以到达现有的'packageDebugResources'任务并添加对我的插件的依赖?类似于以下内容(在我尝试过的任何变体中都不起作用):

tasks.named('packageDebugResources').dependsOn generateOpenApiFooBar
a7qyws3x

a7qyws3x1#

您需要在afterEvaluate中执行此操作,或者更好的方法是使用androidComponents API:

androidComponents {
  onVariants { variant ->
    tasks.named("package${variant.name.replaceFirstChar(Char::uppercaseChar)}Resources")
      .dependsOn("generateOpenApiFooBar")
  }
}

这是因为Android Gradle插件会在afterEvaluate配置阶段注册所有任务,因此如果您在此阶段之前尝试使用tasks.named查找任务,则会收到UnknownTaskException异常。
原始警告通常发生在任务错误地生成作为另一任务输入的源时。例如,某些任务直接将输出生成到另一个任务的现有输入目录中。这很糟糕,因为Gradle无法知道它需要在编译任务之前运行您的任务。
相反,他们应该将输出写入自己的目录,然后将此目录添加为源集的源目录。重要的是,不要直接将目录添加到源集中,而是使用附加到任务的属性,以便Gradle知道谁生成了这些文件(srcDir(myTaskProvider.flatMap { it.outputDirectory })或类似的东西)。
当使用Android时,他们有一个API用于注册源生成任务。你可以这样使用它:

@Suppress("LeakingThis")
abstract class BuildConfigTask : DefaultTask() {
    @get:Input
    abstract val packageName: Property<String>

    @get:Input
    abstract val variantName: Property<String>

    @get:OutputDirectory
    abstract val outputDirectory: DirectoryProperty

    init {
        // This prevents changing the value after it's been read
        packageName.finalizeValueOnRead()
        variantName.finalizeValueOnRead()

        // This is set automatically by the Android Gradle Plugin
        outputDirectory.finalizeValueOnRead()
    }

    @TaskAction
    fun generateStuff() {
        outputDirectory.get()
            .also { it.asFile.deleteRecursively() }
            .file("${packageName.get().replace('.', '/')}/BuildConfig.kt")
            .asFile
            .also { it.parentFile.mkdirs() }
            .writeText("""
                package ${packageName.get()}
                
                object BuildConfig {
                  val variant: String = "${variantName.get()}"
                }
            """.trimIndent())
    }
}

androidComponents {
    onVariants { variant ->
        val task = tasks.register<BuildConfigTask>("generate${variant.name.replaceFirstChar(Char::uppercaseChar)}BuildConfig") {
            packageName.set(android.namespace)
            variantName.set(variant.name)
        }
        // This can be `.java` even if you're generating Kotlin code
        variant.sources.java?.addGeneratedSourceDirectory(task, BuildConfigTask::outputDirectory)
    }
}

运行./gradlew assembleDebug将在build/generated/java/generateInternalDebugBuildConfig/com/example/BuildConfig.kt中生成以下文件:

package com.example

object BuildConfig {
  val variant: String = "debug"
}
wlsrxk51

wlsrxk512#

可以使用project.tasks属性获取对项目中所有任务的引用。然后,您可以使用dependsOn方法在插件任务上添加依赖项。

project.tasks['packageDebugResources'].dependsOn('generateOpenApiFooBar')

相关问题