2015-10-20 75 views
2

我目前有一组文件,其中包含需要在复制到目标构建目录之前解析并转换为XML的DSL。Gradle Zip任务:复制时替换整个文件内容

我使用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') 
} 

什么是解决这个问题的最好方法是什么?

不幸的是,“扩展”和“过滤器”选项似乎不起作用,因为前者只是扩展属性,后者只给我一条线。

谢谢!

回答

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) 
    } 
}