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

Gradle 如何获取SourceDirectorySet中文件的相对路径,gradle,plantuml,Gradle,Plantuml,我想使用一个目录结构来处理一些源代码,我想将输出保存在builddir下,模仿原始dir结构。例如: src/main/plantuml +dir1 +肮脏的 +file.pu 应导致: build/doc/plantuml +dir1 +肮脏的 +file.png 我怎样才能做到呢 注意:SourceDirectorySet 背景 我想扩展janvolck的插件(已经有了),这样它就可以在一个配置好的目录下生成输出文件,但要保持原来的目录层次结构。gradle插件的当前实现遍历Source

我想使用一个目录结构来处理一些源代码,我想将输出保存在builddir下,模仿原始dir结构。例如:

src/main/plantuml
+dir1
+肮脏的
+file.pu
应导致:

build/doc/plantuml
+dir1
+肮脏的
+file.png
我怎样才能做到呢

注意:
SourceDirectorySet

背景 我想扩展janvolck的插件(已经有了),这样它就可以在一个配置好的目录下生成输出文件,但要保持原来的目录层次结构。gradle插件的当前实现遍历
SourceDirectorySet
的所有文件,并在源文件所在的同一目录中生成输出文件

这是我能得出的最接近的结果:

//进程目录树
mySourceDirectorySet.srcdiretrees.each{DirectoryTree d->
project.logger.debug(“处理srcdiretree”+d.dir
+“patterns.excludes:”+d.patterns.excludes
+“模式.包括”+d.模式.包括)
//从目录树重建文件树,因为我找不到
//直接从“d”(1)获取文件的任何方法
//…并遍历其文件
project.fileTree(dir:d.dir,
排除:d.patterns.excludes,
includes:d.patterns.includes)
project.logger.info(“--输入文件:”+f)
def relPath=d.dir.toURI().relatize(f.parentFile.toURI())
def outputPath=“/myOutputDir/”+relPath
option.setOutputDir(project.file(outputPath))
processFile(f,选项);
}
}
不幸的是,
(1)
中的技巧似乎不起作用,我无法重新创建适当的文件树


我未经训练的格拉德尔直觉说,完成这项任务应该很容易。我肯定遗漏了什么?

我不熟悉这个插件,但我理解您的要求:对于sourceRoot目录中的每个文件,您希望在destRoot中生成一个名称类似的文件,同时维护目录结构

尝试一下:

def File sourceRoot=新文件(“src/main/plantuml”)
def File desroot=新文件(“build/doc/plantuml”)
sourceRoot.eachFileRecurse(FileType.FILES){File文件->
def relPath=sourceRoot.toURI().relatize(file.toURI())
def destFile=新文件(desroot,relPath.toString())
destFile.parentFile.mkdirs()
destFile.createNewFile()//或者使用此路径创建png
}

我不熟悉该插件,但我理解您的要求:对于sourceRoot目录中的每个文件,您都希望在desroot中生成一个名称类似的文件,同时保持目录结构

尝试一下:

def File sourceRoot=新文件(“src/main/plantuml”)
def File desroot=新文件(“build/doc/plantuml”)
sourceRoot.eachFileRecurse(FileType.FILES){File文件->
def relPath=sourceRoot.toURI().relatize(file.toURI())
def destFile=新文件(desroot,relPath.toString())
destFile.parentFile.mkdirs()
destFile.createNewFile()//或者使用此路径创建png
}

为了避免误解:我不是插件的作者。我只是想实现一个感谢您的尝试,但是“对于sourceRoot目录中的每个文件,您都希望在destRoot中生成一个类似名称的文件”并不是我想要的。我试图生成一个文件,不是为sourceRoot中的每个文件,而是为SourceSet
main
下的DirectorySourceSet中的每个文件。请注意,DirectorySourceSet可以有许多目录。我想让插件更符合gradle精神,因为源代码是用DirectorySourceSet定义的。理想情况下,我会使用
plantUML
属性扩展SourceSet,但这将是一个不同的补丁。因此,为什么不为
DirectorySourceSet
中的每个目录运行我的代码片段,而不是
。createNewFile
在子文件上运行插件的
进程()?我已经完成了重建目录结构的缺失部分。再次感谢您的建议。我宁愿不要,因为它会忽略可能配置的过滤器:
DirectorySourceSet
是为了避免误解:我不是插件的作者。我只是想实现一个感谢您的尝试,但是“对于sourceRoot目录中的每个文件,您都希望在destRoot中生成一个类似名称的文件”并不是我想要的。我试图生成一个文件,不是为sourceRoot中的每个文件,而是为SourceSet
main
下的DirectorySourceSet中的每个文件。请注意,DirectorySourceSet可以有许多目录。我想让插件更符合gradle精神,因为源代码是用DirectorySourceSet定义的。理想情况下,我会使用
plantUML
属性扩展SourceSet,但这将是一个不同的补丁。因此,为什么不为
DirectorySourceSet
中的每个目录运行我的代码片段,而不是
。createNewFile
在子文件上运行插件的
进程()?我已经完成了重建目录结构的缺失部分。再次感谢您的建议。我宁愿不要,因为它会忽略可能配置的过滤器:
DirectorySourceSet
is