Gradle: 创建任务传递参数作为命令行

Gradle: create a task passing parameters as command line

我手动运行以下任务:

./gradlew clean jacocoTestReportFree sonarqube -Pflavor=free
./gradlew clean jacocoTestReportPaid sonarqube -Pflavor=paid

现在我想创建一个新任务来启动它们。这是代码。

apply plugin: 'org.sonarqube'
//SonarQube configuration.
sonarqube {
    def flavorName = ''
    if (project.hasProperty('flavor')) {
        //read the flavor from properties.
        flavorName = flavor
        androidVariant flavorName + "Debug"
    } else {
        androidVariant 'debug'
    }
    properties {
        property 'sonar.host.url', 'http://localhost:9000'
        property "sonar.projectName", "Java Example " + flavorName
        property "sonar.projectKey", "jonceski.kliment.jacococoverageexample." + flavorName
        property 'sonar.java.source', '8'
        property 'sonar.sourceEncoding', 'UTF-8'
        property "sonar.language", "java"
        property "sonar.login", "admin"
        property "sonar.password", "admin"

        property 'sonar.java.binaries', 'build/intermediates/classes/' + flavorName + "/debug"
        property 'sonar.java.test.binaries', 'build/intermediates/classes/' + flavorName + "/debug"
        property 'sonar.junit.reportsPath', 'build/test-results/test' + flavorName.capitalize() +'DebugUnitTest'
        property 'sonar.jacoco.reportPath', fileTree(dir: project.projectDir, includes: ['**/*.exec'])
        property 'sonar.jacoco.itReportPath', fileTree(dir: project.projectDir, includes: ['**/*.ec'])
        property 'sonar.java.coveragePlugin', 'jacoco'
        property 'sonar.exclusions', '**/*.js,**/*.css,**/*.html'
    }
}

这是我尝试过但没有成功的方法。

task coverageFlavorFree {
    doFirst {
        clean
    }
    doLast {
        jacocoTestReportFree
        sonarqube(flavor="free")
    }
}

在 gradle 中,您不应该只调用其他任务。做这些事情的正确方法是为每种风格创建任务并声明它们的依赖关系。

这是一个完整的工作示例:

plugins {
    id "org.sonarqube" version "2.7"
}
apply plugin: 'com.android.application'


android {
    compileSdkVersion 28


    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    flavorDimensions 'version'

    productFlavors {
        professional {
            dimension 'version'
        }
        free {
            dimension 'version'
        }
    }
}

sonarqube {
}

task SonarQubeAll(group: 'SonarQube') {

}

android.applicationVariants.all { flavor ->
    task("${flavor.name}SonarQube", group: 'SonarQube') {
        description = 'Sets the sonarqube configuration'
        finalizedBy 'sonarqube'
        SonarQubeAll.dependsOn("${flavor.name}SonarQube")

        doLast {
            println("Setting flavor to ${flavor.name} for ${project.sonarqube.androidVariant}")
            project.sonarqube.androidVariant = flavor.name
            //TODO: Set other flavor dependent sonarqube properties here
            // using project.sonarqube.properties...
        }
    }
}

这将为每种口味生成一个名为 {flavor}SonarQube 的任务以及一个名为 SonarQubeAll 的根任务。每个 flavor 任务将由实际的 sonarqube 任务完成。根任务将所有其他任务作为依赖项,导致它们全部执行。

这是依赖关系图:

:myapplication:SonarQubeAll
+--- :myapplication:freeDebugSonarQube
+--- :myapplication:freeReleaseSonarQube
+--- :myapplication:professionalDebugSonarQube
\--- :myapplication:professionalReleaseSonarQube