Gradle Zip 任务:复制时替换整个文件内容
Gradle Zip Task: Replace Entire File Content While Being Copied
我目前有一组包含 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')
}
解决这个问题的最佳方法是什么?
不幸的是,'expand' 和 'filter' 选项似乎不起作用,因为前者只是扩展属性而后者一次只给我一行。
谢谢!
我使用自定义 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)
}
}
我目前有一组包含 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')
}
解决这个问题的最佳方法是什么?
不幸的是,'expand' 和 'filter' 选项似乎不起作用,因为前者只是扩展属性而后者一次只给我一行。
谢谢!
我使用自定义 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)
}
}