Gradle Zip任务:复制时替换整个文件内容

时间:2015-10-20 22:41:41

标签: gradle build.gradle

我目前有一组包含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')
}

解决此问题的最佳方法是什么?

不幸的是,'扩展'和'过滤'选项似乎不起作用,因为前者只是扩展属性而后者只能一次为我提供一行。

谢谢!

1 个答案:

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