Как я могу добавить задачу предварительной обработки в gradle

#gradle

#gradle

Вопрос:

Я хочу использовать мои файлы исходного кода с openclover во время обычной компиляции, потому что я хочу использовать его в серверной среде. Идея состоит в том, чтобы запустить наши тесты selenium с инструментальным исходным кодом и таким образом получить покрытие кода. Также это можно использовать для воспроизведения стандартных сценариев использования и поиска горячих точек для оптимизации. Для этого стандартная сборка должна использовать файлы исходного кода.

Я создал 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
}
  

Это изменяет тестовую задачу, чтобы использовать классы из исходного набора clover вместо классов из основного исходного набора. Однако я хотел бы предварительно обработать классы в основном исходном наборе.

Итак, моя идея такова: main: instrument -> compile -> jar , в то время как показанное решение использует два набора исходных текстов:

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

Каким был бы наилучший способ обработать исходные файлы с помощью clover и передать их в компиляцию? В идеале у меня даже был бы переключатель, который включает инструментирование или отключает его.

Ответ №1:

Замена исходных наборов работает. При использовании -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"
    }