首页 > 解决方案 > 如何在 gradle exec 中使用正则表达式?

问题描述

由于 Gradle 集成的 jacoco 插件无法使用,因此存在任务跳过问题。我尝试使用Jacoco 命令行界面Exec-Gradle DSL 7.0 版

    def reportTask = tasks.create(reportTaskName, Exec.class) {
        group = 'Reporting'
        description = "Generate End To End Android Test Jacoco coverage reports on the ${buildVariant.capitalize()} build by Command Line Interface."

        workingDir "${project.buildDir}"
        commandLine "java", "-jar", "${jacocoCLI}", "report", "${project.buildDir}/outputs/code_coverage/${buildVariant}AndroidTest/connected/*.ec",
                "--classfiles", "${project.buildDir}/intermediates/javac/${buildVariant}/classes/",
                "--classfiles", "${project.buildDir}/tmp/kotlin-classes/${buildVariant}/",
                "--html", "${project.buildDir}/jacocoReport/jacocoHtml/",
                "--sourcefiles", "${project.projectDir}/src/main/java",
                "--xml", "${project.buildDir}/jacocoReport/jacocoXml.xml"
    }
    reportTask

当我运行此任务时,我得到:

> Task :qtx:jacocoEtoeAndroidTestReportByCLI FAILED
[INFO] Loading execution data file <xxx>/build/outputs/code_coverage/etoeDebugAndroidTest/connected/*.ec.
Exception in thread "main" java.io.FileNotFoundException: <<xxx>>/build/outputs/code_coverage/etoeDebugAndroidTest/connected/*.ec (No such file or directory)

但是,如果我在终端执行,如下图,任务就会成功。

在此处输入图像描述

这两种用法有什么区别,如何在 Gradle Exec 中使用正则表达式?


更新

def _createAndroidTestCoverageReportByCLI(productFlavorName = "") {
    def buildTypeName = "debug"
    def buildVariant
    buildVariant = "${productFlavorName}${buildTypeName.capitalize()}"
    def getExecDataTaskName = "${ANDROID_TEST_REPORT_TASK_PREFIX}${productFlavorName.capitalize()}${ANDROID_TEST_REPORT_TASK_SUFFIX}ExecDataGetter"
    def reportTaskName = "${ANDROID_TEST_REPORT_TASK_PREFIX}${productFlavorName.capitalize()}${ANDROID_TEST_REPORT_TASK_SUFFIX}ByCLI"
    def jacocoCLI
    String execData

    project.rootProject.allprojects.each { project ->
        if (project.name == "testlib") {
            jacocoCLI = "${project.projectDir}/lib/jacococli.jar"
        }
    }

    def getExecDataTask = tasks.create(getExecDataTaskName, JacocoReport.class) {
        def listEc = []
        def dir = new File("${project.buildDir}/outputs/code_coverage/${buildVariant}AndroidTest/connected/")
        dir.eachFileRecurse() { file ->
            listEc << file
        }
        execData = listEc.join(" ")
    }

    def reportTask = tasks.create(reportTaskName, Exec.class) {
        group = 'Reporting'
        description = "Generate End To End Android Test Jacoco coverage reports on the ${buildVariant.capitalize()} build by Command Line Interface."

        workingDir "${project.buildDir}"
//        commandLine "java", "-jar", "${jacocoCLI}", "report", "${execData}",
//                "--classfiles", "${project.buildDir}/intermediates/javac/${buildVariant}/classes/",
//                "--classfiles", "${project.buildDir}/tmp/kotlin-classes/${buildVariant}/",
//                "--html", "${project.buildDir}/jacocoReport/jacocoHtml/",
//                "--sourcefiles", "${project.projectDir}/src/main/java",
//                "--xml", "${project.buildDir}/jacocoReport/jacocoXml.xml"

        commandLine "java -jar ${jacocoCLI} report ${execData} --classfiles ${project.buildDir}/intermediates/javac/${buildVariant}/classes/ --classfiles ${project.buildDir}/tmp/kotlin-classes/${buildVariant}/ --html ${project.buildDir}/jacocoReport/jacocoHtml/ --sourcefiles ${project.projectDir}/src/main/java --xml ${project.buildDir}/jacocoReport/jacocoXml.xml"
    }
    reportTask.dependsOn getExecDataTask
}

错误

> Task :qtx:jacocoEtoeAndroidTestReportByCLI FAILED

Execution failed for task ':qtx:jacocoEtoeAndroidTestReportByCLI'.
> A problem occurred starting process 'command 'java -jar <RepoPath>/testlib/lib/jacococli.jar report <RepoPath>/QTX/build/outputs/code_coverage/etoeDebugAndroidTest/connected/spoon1619160691046.ec <RepoPath>/QTX/build/outputs/code_coverage/etoeDebugAndroidTest/connected/spoon1619161047292.ec <RepoPath>/QTX/build/outputs/code_coverage/etoeDebugAndroidTest/connected/spoon1619160787358.ec --classfiles <RepoPath>/QTX/build/intermediates/javac/etoeDebug/classes/ --classfiles <RepoPath>/QTX/build/tmp/kotlin-classes/etoeDebug/ --html <RepoPath>/QTX/build/jacocoReport/jacocoHtml/ --sourcefiles <RepoPath>/QTX/src/main/java --xml <RepoPath>/QTX/build/jacocoReport/jacocoXml.xml''

我试图execfiles通过列表传入,任务仍然失败。当我将失败的命令复制到终端执行时,可以成功执行。

为什么?如何在 Gradle 中执行?

标签: gradlejacoco

解决方案


推荐阅读