Gradle 如何使用taskGraph.whenReady闭包一个接一个地运行任务

Gradle 如何使用taskGraph.whenReady闭包一个接一个地运行任务,gradle,build.gradle,Gradle,Build.gradle,我试图在gradle构建的TAR文件中包含一个ZIP文件。我不是疯了,这是为了复制一个现有的ant脚本,我不能因为各种业务原因更改分发布局 我不得不使用whenReady闭包来避免出现问题 whenReady意味着直到buildTar任务完成后才构建ZIP文件,即使buildTar依赖于buildZip 我不能直接调用tar{},因为gradle不支持这一点 Gradle似乎不支持直接调用任务 这是我的总布置图 task buildZip(type: Zip) { gradle.tas

我试图在gradle构建的TAR文件中包含一个ZIP文件。我不是疯了,这是为了复制一个现有的ant脚本,我不能因为各种业务原因更改分发布局

  • 我不得不使用whenReady闭包来避免出现问题
  • 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中看到的输出,即TAR在ZIP构建之前构建

Building TAR
ZIP ready
更新

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


Tar不是在Zip之前构建的,Tar任务是 在执行Zip任务之前配置

更新


此问题不再需要,因为ZIP任务中可以使用选项duplicatesStrategy,以避免gradle.taskGraph“修复”此问题。当您准备好时,这里有一个示例工作解决方案:

构建.渐变

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'
}   
你明白了吗


另外,我认为这是一个好主意,你可以阅读。

这里有一个工作解决方案示例:

构建.渐变

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'
}   
你明白了吗


另外,我认为这是一个好主意,你可以阅读。

这里有一个工作解决方案示例:

构建.渐变

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'
}   
你明白了吗


另外,我认为这是一个好主意,你可以阅读。

这里有一个工作解决方案示例:

构建.渐变

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'
}   
你明白了吗


另外,我认为这对你来说是个好主意。

这个问题的答案实际上是由Perryn Fowler在顶部评论中提供的,这是基于我对gradle中执行与配置的误解。我已经创建了这个答案,所以问题被标记为已回答。另一个答案简单地解释了原始问题,并带有指向userguide的链接


Tar不是在Zip之前构建的,Tar任务是 在执行Zip任务之前配置


i、 e.运行特殊任务中的任何嵌套命令,例如Zip、Tar等,配置时,稍后执行from块

这个问题的答案实际上是由Perryn Fowler在顶部评论中提供的,这是基于我对gradle中执行与配置的误解。我已经创建了这个答案,所以问题被标记为已回答。另一个答案简单地解释了原始问题,并带有指向userguide的链接


Tar不是在Zip之前构建的,Tar任务是 在执行Zip任务之前配置


i、 e.运行特殊任务中的任何嵌套命令,例如Zip、Tar等,配置时,稍后执行from块

这个问题的答案实际上是由Perryn Fowler在顶部评论中提供的,这是基于我对gradle中执行与配置的误解。我已经创建了这个答案,所以问题被标记为已回答。另一个答案简单地解释了原始问题,并带有指向userguide的链接


Tar不是在Zip之前构建的,Tar任务是 在执行Zip任务之前配置


i、 e.运行特殊任务中的任何嵌套命令,例如Zip、Tar等,配置时,稍后执行from块

这个问题的答案实际上是由Perryn Fowler在顶部评论中提供的,这是基于我对gradle中执行与配置的误解。我已经创建了这个答案,所以问题被标记为已回答。另一个答案简单地解释了原始问题,并带有指向userguide的链接


Tar不是在Zip之前构建的,Tar任务是 在执行Zip任务之前配置



i、 e.运行特殊任务中的任何嵌套命令,例如Zip、Tar等,配置时,稍后执行from块

Tar不是在Zip之前构建的,Tar任务是在Zip任务执行之前配置的。请参阅@Perrynfoller,你能添加你的评论作为答案吗?我会接受。Tar不是在Zip之前生成的,Tar任务是在Zip任务执行之前配置的。请参阅@Perrynfoller,你能添加你的评论作为答案吗?我会接受。Tar不是在Zip之前生成的,Tar任务是在Zip任务执行之前配置的。请参阅@Perrynfoller,你能添加你的评论作为答案吗?我会接受。Tar不是在Zip之前生成的,Tar任务是在Zip任务执行之前配置的。请参见@Perrynfoller,您是否可以添加您的评论作为答案,我将接受。不幸的是,我需要使用gradle.taskGraph.whenReady,原因如原始问题中的链接所述。我已经阅读了用户指南…好吧。请您准备一份SSCCE以尝试更好地理解需求,而不是
gradle.taskGraph.whenReady{from…}
,应该使用
from{…}
。无论如何,这不会改变任何基本的东西
buildTar
应该使用buildZip中的
,这也使得显式的
dependsOn
变得不必要。@PeterNiederwieser gradle.taskGraph.whenReady仅用于解决中的问题,如果您有其他解决方案,请告诉我!正如我已经说过的,{…}
中的
应该改为使用(注意大括号)。不幸的是,我需要使用gradle.taskGraph.whenReady,原因如原始问题中的链接所述。我已经阅读了用户指南…好吧。你能准备一份SSCCE来试着理解要求吗