将解压缩的文件复制到具有动态命名的子文件夹的文件夹中

时间:2016-05-13 12:52:27

标签: gradle groovy

我有一个文件夹copyAggregatedLibs。在这个文件夹中,我有2个libs> a-libs.zip,b-libs.zip。这些库具有结构>> a-libs.zip - jar和b-libs.zip - jar 现在我想在unzippedLiraries的另一个文件夹中解压缩这些文件,使结构完好无损。它应该看起来像:unzippedLibraries - a-libs - jar和b-libs - jar。 现在的问题是,我在名为libNames的数组中动态获取库的名称。 libNames = {a-lib.zip,b-lib.zip} 现在,我编写了一个任务来将文件从copyAggregatedLibs解压缩到unzippedLibraries

task unzipLibrary(type:Copy){
libNames.each { fullComponentName ->
   println('fullname'+fullComponentName)
   def zipFile = []
    zipFile = file('build/tmp/libs/copyAggregatedLibraries/'+fullComponentName)
   from zipTree(zipFile)
   println('Zips'+zipFile)
   into 'build/tmp/unpacked/unzippedLibraries/'+fullComponentName
   }

   }

现在,zip打印两个文件的名称,但我没有得到文件夹结构。我得到的只是第二个库的名称,即b-lib里面的jar文件夹。似乎不是每次都不会运行。谁能建议我如何让这个工作。

我也尝试过destinationDir。它不起作用 还尝试使用两个任务,在另一个内执行一个,也不起作用。说没有源文件

1 个答案:

答案 0 :(得分:0)

为什么它不起作用:Copy taskfrom方法可以多次调用,每次添加另一个源文件/目录进行复制。然而,into方法就像目标目录的setter一样。

你应该能够实现这样的目标:

task unzipLibrary(type:Copy){
    libNames.each { fullComponentName ->
       println('fullname'+fullComponentName)
       def zipFile = file('build/tmp/libs/copyAggregatedLibraries/'+fullComponentName)
       println('Zips'+zipFile)
       into project.buildDir
       // the following into calls will be relative to the one above
       from(zipTree(zipFile)) {
           into 'tmp/unpacked/unzippedLibraries/'+fullComponentName // notice the missing leading 'build/'
       }
   }
}

此处from calls使用提供的闭包来配置子CopySpec。这也是闭包内指定的目录相对于任务的目标目录的原因。