我目前有一组包含DSL的文件,在复制到目标构建目录之前需要将其解析并转换为XML。
我使用eachFile挂钩来完成此操作,但是当我替换文件的内容时,源文件也会被更改:
task build(type: Zip) {
with {
archiveName = "${project.name}-${project.version}.${extension}"
destinationDir = buildDir
}
from('workflow/dsl') {
eachFile { fileDetails ->
String xml = new OozieDslParser().parse(fileDetails.getFile())
fileDetails.setName(fileDetails.getName().replaceFirst(~/\.[^\.]+$/, '.xml')
fileDetails.getFile().text = xml //This changes the source file as well.
}
}
from('workflow/resources')
}
解决此问题的最佳方法是什么?
不幸的是,'扩展'和'过滤'选项似乎不起作用,因为前者只是扩展属性而后者只能一次为我提供一行。
谢谢!
答案 0 :(得分:1)
我使用自定义FilterReader来解决此问题:
class OozieDslFilter extends FilterReader {
OozieDslFilter(Reader input) {
super(new StringReader(new OozieDslParser().parse(input.text)))
}
}
task build(type: Zip) {
with {
archiveName = "${project.name}-${project.version}.${extension}"
destinationDir = buildDir
}
from('workflow/resources')
from('workflow/dsl') {
rename { it - ~/\.[^\.]+$/ + '.xml' }
filter(OozieDslFilter)
}
}