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