如何获取SourceDirectorySet中文件的相对路径

时间:2015-10-29 16:09:41

标签: gradle plantuml

我想使用SourceDirectorySet从目录结构处理一些来源,并且我希望将输出保存在构建目录下,模仿原始目录结构。 E.g:

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

应该导致:

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

我怎么能实现它?

N.B。:SourceDirectorySetPatternFilterable

背景

我想扩展janvolck的插件"gradle-plantuml-plugin"(已经有corresponding feature request),以便它在配置的目录下生成输出文件,但保留原始目录层次结构。 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 个答案:

答案 0 :(得分: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
}