x90
x90

Reputation: 2170

Customize gradle task properties when dependsOn

I created custom task which should process output of gradle dependencies task ( exactly ./gradlew dependencies --configuration myFlavorDebugRuntimeClasspath). I want to create my custom task for every buildVariant (PassportGenerateTask passportGen = project.tasks.create("pasportGenerate${variantName}", PassportGenerateTask)).

But i cant customize dependenciesReportTask properties for every passportGen. When i call passportGen for speciefic buildVariant it use dependenciesReportTask.setProperty("configurations", ...) of last build variant among all (project.android.applicationVariants.all).

For examlpe if I have following build variants (googleDebug googleRelease samsungDebug samsungRelease) and call passportGen task (./gradlew pasportGenerateGoogleDebug) it will use wrong properties for dependenciesReportTask (configuration will be samsungReleaseRuntimeClasspath configuration )

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

            }
        }
    }
}

The only way i can achieve what i want is call:

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

inside my custom PassportGenerateTask task main action method (@TaskAction) but calling execute inside other task is deprecated feature and will be removed in gradle 5.0

Upvotes: 1

Views: 799

Answers (1)

Vampire
Vampire

Reputation: 38649

It is not only deprecated, it is purely internal implementation detail that most probably does not do what you expect it does and almost always produces many more problems than it tries to solve and actually fails.

You most probably also shouldn't rape the dependencies task. If you need multiple such tasks with different configuration, simply create new tasks of type DependencyReportTask and configure them however you like.

Upvotes: 2

Related Questions