1

我想使用 a 处理来自目录结构的一些源,SourceDirectorySet并且我想将输出保存在构建目录下,模仿原始目录结构。例如:

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

应该导致:

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

我怎样才能实现它?

注意:SourceDirectorySetPatternFilterable

背景

我想扩展 janvolck 的插件“gradle-plantuml-plugin”(已经有相应的功能请求),以便它在配置的目录下生成其输出文件,但保持原始目录层次结构。gradle 插件的当前实现会遍历 a 的所有文件,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。

我未经训练的 gradle 直觉说完成这项任务应该很容易。我肯定错过了什么?

4

1 回答 1

0

我不熟悉该插件,但据我了解您的要求:对于 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
}
于 2015-10-30T02:23:41.713 回答