在 dependsOn 时自定义 gradle 任务属性

Customize gradle task properties when dependsOn

我创建了自定义任务,它应该处理 gradle dependencies 任务的输出(正好是 ./gradlew dependencies --configuration myFlavorDebugRuntimeClasspath)。我想为每个 buildVariant (PassportGenerateTask passportGen = project.tasks.create("pasportGenerate${variantName}", PassportGenerateTask)) 创建自定义任务。

但我无法为每个 passportGen 自定义 dependenciesReportTask 属性。当我为特定的 buildVariant 调用 passportGen 时,它使用所有 (project.android.applicationVariants.all).

中最后一个构建变体的 dependenciesReportTask.setProperty("configurations", ...)

例如,如果我有以下构建变体(googleDebug googleRelease samsungDebug samsungRelease)并调用 passportGen 任务(./gradlew pasportGenerateGoogleDebug),它将使用错误的 dependenciesReportTask 属性(配置将是 samsungReleaseRuntimeClasspath 配置)

class AppPlugin implements Plugin<Project> {


    void apply(Project project) {

        project.afterEvaluate {
            // Create tasks for each Build Variant
            project.android.applicationVariants.all { ApplicationVariant variant ->
                def variantName = variant.name.capitalize()
                def variantOutput = variant.outputs.first()



                //Generating configuration name for dependency report
                def configurationName = ""
                if (variant.productFlavors.size() > 0) {
                    configurationName += variant.productFlavors.get(0).name
                    configurationName += variant.getBuildType().name.capitalize()
                } else {
                    configurationName += variant.getBuildType().name
                }
                configurationName += "RuntimeClasspath"

                def configurations = project.configurations.collect()

                configurations.removeAll {
                    !it.name.equals(configurationName)
                }


                //prepare file for output of "dependencies" tasks
                def depReportFileName = "dependeciesReport${variantName}.txt"
                def dependenciesReportOutputFile = new File(depReportFileName)


                //Get "dependencies" task from all project tasks
                def dependenciesReportTask = project.tasks["dependencies"]
                dependenciesReportTask.setProperty("configurations", configurations)
                dependenciesReportTask.setProperty("outputFile", dependenciesReportOutputFile)


                //create cutom task for every buildVariant which depends on "dependencies" task
                PassportGenerateTask passportGen = project.tasks.create("pasportGenerate${variantName}", PassportGenerateTask)
                passportGen.variant = variant
                passportGen.configuration = configurations.collect().get(0)

                //add dependency on "dependencies"
                passportGen.dependsOn dependenciesReportTask

            }
        }
    }
}

我可以实现我想要的唯一方法是调用:

def dependenciesReportTask = project.tasks["dependencies"]
dependenciesReportTask.setProperty("configurations", configurations)
dependenciesReportTask.setProperty("outputFile", dependenciesReport)
dependenciesReportTask.execute()

在我的自定义 PassportGenerateTask 任务主要操作方法 (@TaskAction) 中,但在其他任务中调用执行是不推荐使用的功能,将在 gradle 5.0

中删除

它不仅被弃用,而且它是纯粹的内部实现细节,很可能不会做你期望它做的事情,而且几乎总是产生比它试图解决的问题多得多的问题实际上失败了。

您很可能也不应该强奸 dependencies 任务。如果您需要多个具有不同配置的此类任务,只需创建 DependencyReportTask 类型的新任务并根据需要配置它们。