如何在gradle中添加预处理任务

时间:2019-03-09 10:24:20

标签: gradle

我想在常规编译期间使用openclover来检测源代码文件,因为我想在服务器环境中使用它。 这个想法是针对已检测的源代码运行我们的硒测试,并以此方式获得代码覆盖率。同样,这可以用于重播标准使用场景并找到热点进行优化。 为此,标准构建需要检测源代码文件。

我创建了一个类似于显示的here的build.gradle。

摘要:

sourceSets {
   clover {
       java {
          srcDir "$buildDir/sources-instr"
      }
   }
}
task cloverInstr() {
  inputs.files sourceSets.main.allJava
  outputs.dir "$buildDir/sources-instr"

  doFirst {
      [...]

    com.atlassian.clover.CloverInstr.mainImpl(args)
    }
}

cloverClasses.dependsOn cloverInstr

test {
  def cloverClasspath = configurations.testRuntime + configurations.cloverRuntime + sourceSets.test.output + sourceSets.clover.output
  classpath = cloverClasspath
}

这将测试任务更改为使用三叶草源集中的类而不是主源集中的类。我想对主要源集中的类进行预处理。

所以我的想法是:main: instrument -> compile -> jar,而所示的解决方案正在使用两个源集:

main: compile -> jar
clover: instrument -> compile -> test

用三叶草检测源文件并将其传递给编译的最佳方法是什么?理想情况下,我什至会有一个启用或禁用检测的开关。

1 个答案:

答案 0 :(得分:0)

交换源集有效。使用-PwithClover时,以下部分被激活。它将主源集更改为检测代码所在的路径。然后,编译任务将获得一个依赖关系,该依赖关系会将代码检测到相同的路径。

有点黑,但是可以用。

if (project.hasProperty("withClover")) {
        buildscript {
            repositories {
                jcenter()
            }

            dependencies {
                classpath 'org.openclover:clover:4.3.1'
            }
        }

        configurations {
            cloverRuntime
            cloverRuntime.extendsFrom cloverCompile
        }
        //swap src dirs, main is now the instrumented and clover the actual srcs
        sourceSets {
            main {
                java {
                    srcDirs = ["$buildDir/sources-instr"]
                }
            }
            clover {
                java {
                    srcDirs = ["src/main/java"]
                }
            }
        }
        dependencies {
            //compile 'org.openclover:clover:4.3.1'
            // make sure clover is available in the jar
            embed 'org.openclover:clover:4.3.1'
        }
        //instrumentation task
        task cloverInstr() {
            inputs.files sourceSets.clover.allJava
            outputs.dir "${buildDir}/sources-instr"
            doFirst {
                def argsList = ["--initstring", "${buildDir}/clover/clover.db",
                                "-d", "${buildDir}/sources-instr"]
                argsList.addAll(inputs.files.files.collect({ file ->
                    file.absolutePath
                }))
                String[] args = argsList.toArray()
                com.atlassian.clover.CloverInstr.mainImpl(args)
            }
        }
        //create src files for main src set
        compileJava.dependsOn "cloverInstr"
    }