使用gradle复制/同步从zip中提取时删除文件路径的一部分

时间:2018-05-18 08:01:30

标签: gradle

给定一个声明为gradle依赖的zip文件

dependencies {
    orientdb(group: "com.orientechnologies", name: "orientdb-community", version: orientdbVersion, ext: "zip")
}

包含以下结构中的文件

.
└── orientdb-community-2.2.33
    ├── benchmarks
    │   ├── bench_memory_get.bat
    │   └── post.txt
    ├── bin
    │   ├── backup.sh
    ...

可以使用以下任务将zip内容同步到给定的目标目录,同时保留zip的完整结构:

task("deploy-db", type: Sync) {
    from(configurations.orientdb.collect { zipTree(it) })
    into(orientdbTgt)
}

如何配置上述任务以从结果中删除"orientdb-community-$orientdbVersion"目录,以便输出为:

/${orientdbTgt}
 ├── benchmarks
 │   ├── bench_memory_get.bat
 │   └── post.txt
 ├── bin
 │   ├── backup.sh
 ...

信息:rename("(.*/)orientdb-community-$orientdbVersion/(.+)", '$1$2')似乎不起作用,因为它仅对文件名起作用,此处的重命名与路径有关。

1 个答案:

答案 0 :(得分:1)

使用Gradle 4.5.1,以下是一个合理的传真机。

它使用eachFile任务上的Syncdoc)功能。下面,我们更改FileCopyDetails传递的eachFile对象的路径。

project.ext.orientdbTgt = 'staging'
project.ext.prefixDir = "orientdb-community-2.2.33${File.separator}"

task("deploy-db", type: Sync) {
    from(configurations.orientdb.collect { zipTree(it) })
    into(orientdbTgt)

    eachFile { fileCopyDetails ->
        def originalPath = fileCopyDetails.path
        fileCopyDetails.path = originalPath.replace(prefixDir, "")                   
    }

    doLast {
        ant.delete(dir: "${orientdbTgt}/${prefixDir}")
    }
}