如何使用taskGraph.whenReady闭包运行任务

时间:2014-09-15 09:13:53

标签: gradle build.gradle

我正在尝试在gradle构建中将ZIP文件包含在TAR文件中。我不是疯了,这是复制现有的蚂蚁脚本,我不能因各种商业原因改变发行版布局。

  • 我必须使用whenReady闭包collect dependencies而不会出现问题
  • whenReady表示直到buildTar任务完成后才构建ZIP文件,即使buildTar依赖于buildZip。
  • 我无法直接调用tar {},因为gradle不支持此
  • Gradle似乎不支持直接调用任务。

这是我的总体布局

task buildZip(type: Zip) {
   gradle.taskGraph.whenReady {
      // build zip file usual way with from blocks
      from(...) {
      }
      from(...) {
      }
   }
   doLast {
      println "ZIP ready"
      // could I call tar task from here??
   }
}

task buildTar(type: Tar, dependsOn: buildZip) {
    println "Building TAR"
    from (buildZip.archivePath) {
    }
    ... more stuff, installer script etc.
}

输出我看到gradle:buildTar,即在构建ZIP之前构建TAR。

Building TAR
ZIP ready

更新

下面的Perryn Fowler评论正确地指出了问题,它是基于我对gradle中的执行与配置的误解。

  

在Tar,Tar任务正在进行之前,没有构建Tar   在执行Zip任务之前配置

更新

此问题不再需要,因为可以在ZIP任务中使用duplicatesStrategy选项,以避免问题被gradle.taskGraph.whenReady“修复”

2 个答案:

答案 0 :(得分:2)

这个问题的答案实际上是由Perryn Fowler在最高评论中提供的,这是基于我对gradle中执行与配置的误解。我已创建此答案,因此问题已标记为已回答。另一个答案只是通过指向用户指南的链接来解释原始问题。

  

在Tar,Tar任务正在进行之前,没有构建Tar   在执行Zip任务之前配置

即。特殊任务中的任何嵌套命令,例如Zip,Tar等运行和配置时间,后来执行from块。

答案 1 :(得分:1)

此处您有一个示例工作解决方案:

<强>的build.gradle

task buildZip(type: Zip) {
    from 'dir'
    destinationDir project.file('build/zip')
    archiveName 'lol.zip'
}

task buildTar(type: Tar, dependsOn: buildZip) {
    from 'build/zip'
    include '*.zip'
    destinationDir project.file('build/tar')
    archiveName 'lol.tar'
}   

这对你来说是否清楚?

P.S。我认为你最好先阅读userguide