【问题标题】:How to run a task after another using taskGraph.whenReady closure如何使用 taskGraph.whenReady 关闭一个又一个任务
【发布时间】:2014-09-15 09:13:53
【问题描述】:

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

  • 我必须使用 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 看到的输出,即 TAR 在 ZIP 构建之前构建。

Building TAR
ZIP ready

更新。

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

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

更新。

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

【问题讨论】:

  • 在 Zip 之前没有构建 Tar,在执行 Zip 任务之前正在配置 Tar 任务。见gradle.org/docs/current/userguide/…
  • @PerrynFowler 请您添加您的评论作为答案,我会接受。

标签: gradle build.gradle


【解决方案1】:

这个问题的答案实际上是由顶级 cmets 中的 Perryn Fowler 提供的,这是基于我对 gradle 中执行与配置的误解。我已经创建了这个答案,所以问题被标记为已回答。另一个答案只是通过指向用户指南的链接来解释原始问题。

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

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

【讨论】:

  • from 不会在以后执行,除非使用from { ... },这是一种比gradle.taskGraph.whenReady { from ... } 更准确的延迟评估方式。
  • 是的,我完全同意一般情况。但是,如果您的“来自”来自 (subprojects.configurations.compile),我发现情况有些不同.... subprojects.configurations.compile 在多项目设置中返回重复项,删除这些重复项的唯一方法是调用子项目.configurations.compile.resolvedConfiguration,但是这必须在 gradle.taskGraph.whenReady 之后关闭,如果它在之前完成,即没有 gradle.taskGraph.whenReady 那么子项目无法配置它们的依赖项块,因为它们已经被标记为已解决(更改只读)。
【解决方案2】:

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

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'
}   

你清楚了吗?

附:我认为您阅读userguide 是个好主意。

【讨论】:

  • 不幸的是,由于原始问题中的链接中描述的原因,我需要使用 gradle.taskGraph.whenReady 。我已经阅读了用户指南...
  • 好的。您能否准备一份 SSCCE 来尝试并很好地理解要求?
  • 应该使用gradle.taskGraph.whenReady { from ... },而不是from { ... }。无论如何,这不会改变任何基本的东西。 buildTar 应该使用from buildZip,这也使得显式dependsOn 变得不必要。
  • @PeterNiederwieser gradle.taskGraph.whenReady 只需要解决stackoverflow.com/questions/25752078/… 中的问题,如果您有其他解决方案,请告诉我!
  • 正如我已经说过的,应该使用from { ... } 代替(注意花括号)。
猜你喜欢
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多