如何将FileCollection的元素传递给Exec?

我有这个任务,它从另一个任务中获取输入,并调用Perl脚本来生成三个输出文件。

task acct(type: Exec) {
    inputs.files getAcct
    outputs.files "file1", "file2", "file3"
    executable "perl"
    args "makeAcct.pl", inputs.files.singleFile, "file1", "file2", "file3"
}

这可行,但是我不想在outputs.filesargs中重复文件名。

我试过通过args传递这些
  • outputs.files.getFiles().toArray(),但是得到一个Object []并传递[Ljava.lang.Object;@340bccc9
  • outputs.files.asType(Object[])获取File []并传递[Ljava.io.File;@6280a9b8
  • outputs.files.getFiles()获取集合并传递[file1, file2, file3]
  • outputs.files.getAsPath()获取单个字符串并传递file1:file2:file3
  • outputs.files.getAsPath().replaceAll(File.pathSeparator, " ")获取file1 file2 file3,但这仍作为一个参数而不是作为三个参数传递
  • outputs.files.singleFile抛出异常,因为存在多个文件(由于只有一个输入文件,因此适用于输入)
  • outputs.files.getFiles().toArray()[0], outputs.files.getFiles().toArray()[1], outputs.files.getFiles().toArray()[2]可以工作,但比仅输入文件名
  • 还要更丑陋

    最佳答案

    注意:

  • FileCollection是-java.util.Collection
  • 有一个Exec#args重载,需要一个Iterable(请参阅Gradle Build Language Reference中的Exec)。
  • 按照约定,接受多个参数的配置方法是可加的。

  • 这给出:
    task acct(type: Exec) {
        inputs.files getAcct
        outputs.files "file1", "file2", "file3"
        executable "perl"
        args "makeAcct.pl"
        args inputs.files
        args outputs.files
    }
    

    另外,散布集合(args "makeAcct.pl", *(inputs.files), *(outputs.files))也应该起作用。

    关于gradle - 如何将gradle文件集合传递给exec?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23922208/

    10-16 09:30