Как получить относительный путь к файлам в 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
}