如何使用 Gradle 在没有第一个目录的情况下提取?

问题描述 投票:0回答:2

我正在尝试提取一个不带 PARENT 目录的依赖 zip 文件,在使用 Gradle 提取时排除一些文件。

这是我所拥有的,这有效,但感觉不对,我希望有更好的方法来做到这一点

我正在提取的Zip文件

jar tf parent-folder-name.zip


parent-folder-name/bin/something.sh
parent-folder-name/bin/something.bat
parent-folder-name/lib/somelib.jar

选项1

task explodeToDist1(type: Copy) {
    from zipTree(configurations.extractDist.singleFile)
    exclude "**/lib/**"
        eachFile {
            def newPath = it.relativePath.segments[1..-1].join("/")
            it.relativePath = RelativePath.parse(true, newPath)
        }
    into 'build/dist'
    doLast {
        def path = buildDir.getPath() + "/dist/parent-folder-name"
        def dirToDelete = new File(path)
        dirToDelete.deleteOnExit()
    }
}

选项2

task explodeToDist2 << {
        def unzipDir = new File('build/unzipTmp')
        copy {
            from zipTree(configurations.extractDist.singleFile)
            into unzipDir
        }
        def rootZipDir = unzipDir.listFiles()[0]
        fileTree(rootZipDir){
                exclude "**/lib/**"
        }.copy {
            into 'src/dist'
        }
        unzipDir.deleteDir()
}

对我来说选项 2 感觉更好,但我不确定在 Gradle 中是否有更好的方法来做到这一点?

groovy build gradle unzip
2个回答
2
投票

似乎 gradle 中还没有以非常用户友好的方式支持您的用例。 这里列出了相关的功能请求。

还有这个类似的 stackoverflow 问题,其中有一些建议看起来比您已有的选项更容易。

因为 gradle 与 ant 集成得很好,而且 ant 解压缩任务确实支持扁平化,所以你也可以依赖它。

更多详情请参阅:


0
投票

只是为了补充我的解决方案,因为我花了一个小时左右的时间来整理它......也许对其他人有帮助。我按照 GlennV 的建议使用了 Ant 解压缩任务:

task unzipDist {
    dependsOn distZip
    doLast {
        ant.unzip(
           src:       tasks.distZip.archiveFile.get(),
           dest:      "${buildDir}/unzippedDist",
           overwrite: 'true'
        ) {
            cutdirsmapper(dirs:1)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.