Как я могу добавить задачу предварительной обработки в Gradle - PullRequest
1 голос
/ 09 марта 2019

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

Я создал 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 голосов
/ 15 марта 2019

Замена исходных наборов работает.При использовании -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"
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...