如何使用 Gradle 复制任务重命名我正在复制的文件路径上的目录?

Thu*_*rge 1 groovy copy gradle

背景

我有一个像这样的 Gradle 复制任务:

task copyFromZip(type: Copy) {
    from zipTree("Example.zip")
    into "build/output"
}
Run Code Online (Sandbox Code Playgroud)

Zip 文件内是这样的:

+--- photos
|    +--- StackOverflow
|         \--- foo.png
|    \--- Super User
|         \--- bar.png
+--- text
|    \--- Stack Exchange
|        +--- StackOverflow
|             \--- foo.txt
|        \--- Super User
|             \--- bar.txt
Run Code Online (Sandbox Code Playgroud)

当我运行复制任务时,目录将被保留。例如,我有build/output/photos/StackOverflow/foo.png.

目标

我想要做的是在复制时重命名目录。例如,假设我意识到“StackOverflow”中应该有空格。我希望将文件photos/StackOverflow/foo.png复制到build/output/photos/Stack Overflow/foo.png,并将同样的内容应用于其他文件夹中名称为“StackOverflow”而不是“Stack Overflow”的文件。

我尝试过的

我的第一个想法是添加一个rename{}块。

task copyFromZip(type: Copy) {
    from zipTree("Example.zip")
    into "build/output"
    rename { String filePath ->
        filePath.replace("StackOverflow", "Stack Overflow")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我发现rename{}只给出文件名,而不给出路径。

我也尝试过操纵relativePath使用eachFile{}

task copyFromZip(type: Copy) {
    from zipTree("Example.zip")
    into "build/output"
    eachFile{ file ->
        file.relativePath = file.relativePath.replace("StackOverflow", "Stack Overflow")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这会导致Could not expand ZIP错误。

如何使用 Gradle 复制任务重命名我正在复制的文件路径上的目录?

JB *_*zet 6

您可以使用eachFilefilesMatching,它使您可以访问源路径和目标路径的所有详细信息。例如:

task copy(type: Copy) {
    from zipTree("Example.zip")
    into "build/output"
    filesMatching("**/StackOverflow/**/*") {
        it.path = it.path.replace("StackOverflow", "Stack Overflow")
    }
}
Run Code Online (Sandbox Code Playgroud)