Как использовать groovy / Gradle DSL для получения списка каталогов, соответствующих шаблону? - PullRequest
1 голос
/ 17 марта 2020

Плагин сонара Gradle имеет свойство sonar.junit.reportPaths, которое должно быть разделенным запятыми списком каталогов, содержащих файлы результатов теста JUnit.

В нашем случае каталоги соответствуют шаблону "^.*/build/test-results/(test|(component|integration)Test)/.*$".

Мы хотели создать этот список, используя fileTree включает / сопоставление.

Но, похоже, fileTree:

  1. Возвращает только файлы, а не каталоги.
  2. Ограничено глобализацией файлов в стиле муравья, а не полными регулярными выражениями.

Поработав намного дольше, чем мы должны были потратить, мы наконец-то отказались и записали это в Java :

def junitResults() {
    Set<String> testDirs = new LinkedHashSet<>()
    for (File file : files(fileTree(dir: rootDir, include: "**/build/test-results/**"))) {
        testDirs.add(file.getAbsolutePath().replaceAll("/build/test-results/(test|(component|integration)Test)/.*", "/build/test-results/\$1"))
    }
    return testDirs.toArray(new String[testDirs.size()]);
}

Это имеет то преимущество, что на самом деле работает, но выглядит уникально c.

Кто-нибудь знает, как заменить это на нормальный Groovy / Gradle DSL?

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

wp78de, ваш ответ указал мне правильное направление (используйте файл, а не fileTree):

def junitResultsDirs() {
def dirs = []
rootDir.eachDirRecurse { dir ->
    if (dir.absolutePath.matches("^.*/build/test-results/(test|(component|integration)Test)\$")) {
        dirs << dir
    }
}
return dirs;

}

0 голосов
/ 17 марта 2020

Может быть что-то с eachDirMatch(), как это

file('path/build/test-results/.').eachDirMatch(/(test|(component|integration)Test)/) { dir ->
    println dir.getPath()
}
...