使用Gradle解压缩时如何展平目录结构?

时间:2014-08-02 05:01:45

标签: gradle

我想从战争中提取一些罐子作为我的gradle(2.0)构建的一部分。 到目前为止,我有这个:

task unzip(type: Copy) {
    def zipFile = file('D:/external/dependent.war')
    def outputDir = file('lib')

    from zipTree(zipFile)
    into outputDir
    include 'WEB-INF/lib/*.jar'
}

这将WEB-INF / lib目录放在outputDir中。 我只想把罐子弄平。

要在Ant中执行此操作,我会这样做:

  <target name="unzip">
    <unzip src="D:/external/dependent.war" dest="lib">
        <patternset>
            <include name="WEB-INF/lib/*.jar"/>
        </patternset>
        <mapper type="flatten"/>
    </unzip>
  </target>

我如何在gradle中完成?

4 个答案:

答案 0 :(得分:6)

我相信您只需将.files附加到zipTree

task unzip(type: Copy) {
    def zipFile = file('D:/external/dependent.war')
    def outputDir = file('lib')

    from zipTree(zipFile).files
    into outputDir
    include 'WEB-INF/lib/*.jar'
}

答案 1 :(得分:3)

似乎这是Gradle http://issues.gradle.org/browse/GRADLE-3025

中的错误/缺失功能

现在我不得不委托好老的可靠的Ant来做这项工作!

task unzip(){
  ant.unzip(src: 'D:/external/dependent.war', dest:'lib', overwrite:"true") {
    patternset( ) {
      include( name: 'WEB-INF/lib/*.jar' )
    }
    mapper(type:"flatten")
  }
}

答案 2 :(得分:3)

我尝试了Al J的答案,但它没有使用包含。

这对我有用:

task unzip(type: Copy) {
    def zipFile = file('D:/external/dependent.war')
    def outputDir = file('lib')

    from zipTree(zipFile).matching{include 'WEB-INF/lib/*.jar'}.files
    into outputDir
}

答案 3 :(得分:2)

Gradle似乎有办法。虽然它更复杂,但不一定那么明显。

task unzip(type: Copy) {
    def zipFile = file('D:/external/dependent.war')
    def outputDir = file('lib')

    from zipTree(zipFile)
    into outputDir
    include '**/*.jar'
    includeEmptyDirs false
    eachFile { FileCopyDetails fcp ->
        // remap the file to the root
        String[] segments = [fcp.getName()]
        fcp.relativePath = new RelativePath(true, segments)
    }
}

includeEmptyDirs false确保不会复制额外的目录。

eachFile块会使结构变平(您必须将名称放入数组才能使其正常工作)。