Как получить относительный путь к файлам в SourceDirectorySet

Я хочу обработать некоторые источники из структуры каталогов, используя SourceDirectorySet и я хотел бы сохранить выходные данные в директории build, имитируя исходную структуру директории. Например:

src / main / plantuml
                + dir1
                   + dir11
                       + file.pu

Должно привести к:

build / doc / plantuml
                + dir1
                   + dir11
                       + file.png

Как я мог достичь этого?

NB: SourceDirectorySet является PatternFilterable

Фон

Я хочу расширить плагин https://github.com/janvolck/gradle-plantuml-plugin (уже существует соответствующий запрос функции), чтобы он генерировал свои выходные файлы в сконфигурированном каталоге, но сохраняя исходную иерархию каталогов. Текущая реализация плагина gradle обходит все файлы SourceDirectorySet и генерирует выходные файлы в том же каталоге, где находятся исходные файлы.

Это самое близкое, что я мог предложить:

// Process directory trees
mySourceDirectorySet.srcDirTrees.each { DirectoryTree d ->
    project.logger.debug("Processing srcDirTree " + d.dir
        + "; patterns.excludes: " + d.patterns.excludes
        + "; patterns.includes" + d.patterns.includes)

    // Reconstruct a FileTree from the directory tree, as I cannot find
    // any means to get the files directly from 'd' (1)
    // ... and traverse its files
    project.fileTree(dir: d.dir,
        excludes: d.patterns.excludes,
        includes: d.patterns.includes).each { File f ->
            project.logger.info("-- Input file: " + f)

            def relPath = d.dir.toURI().relativize(f.parentFile.toURI())
            def outputPath = "/myOutputDir/" + relPath

            option.setOutputDir(project.file(outputPath))
            processFile(f, option);
    }
}

К сожалению, хитрость в (1) кажется, не работает, и я не могу воссоздать соответствующий FileTree.

Моя неподготовленная интуиция говорит, что для достижения этой цели должно быть легко. Я наверняка что-то упустил?

1 ответ

Я не знаком с плагином, но, насколько я понимаю, ваше требование: для каждого файла в вашем каталоге sourceRoot вы хотите сгенерировать файл с аналогичным именем в destRoot, сохраняя при этом структуру каталогов.

Попробуйте это:

def File sourceRoot = new File("src/main/plantuml")
def File destRoot = new File("build/doc/plantuml")

sourceRoot.eachFileRecurse(FileType.FILES) { File file ->
    def relPath = sourceRoot.toURI().relativize(file.toURI())
    def destFile = new File(destRoot, relPath.toString())
    destFile.parentFile.mkdirs()
    destFile.createNewFile() //alternatively use this path to create your png
}
Другие вопросы по тегам