在一个Gradle任务中生成文件以由另一个Gradle任务操作

时间:2014-09-04 23:22:06

标签: groovy gradle

我第一次在Gradle上工作,在我上一个项目中来自Ant。到目前为止,我喜欢我所看到的,虽然我正在试图弄清楚如何做一些有点让我循环的事情。我想知道在以下情况下使用什么样的正确模式。

我有一系列文件,我需要在其中执行许多操作。每个任务都对新生成的任务输出文件进行操作。我会尝试设计一个例子来证明我的问题,因为我的项目有点复杂和内部。

第一阶段

首先,假设我的任务必须写出100个单独的文本文件,每个文本文件中都有一个随机数。该文件的名称无关紧要,让我们说它们都将存在于parentFolder下。

示例:

parentFolder
|
|-file1
|-file2
...
|-file100

我认为我最初的想法是在doLast(使用<<<<<<<<<)关闭自定义任务的循环中执行此操作 - 如下所示:

task generateNumberFiles << {
  File parentFolder = mkdir(buildDir.toString() + "/parentFolder")
  for (int x=0; x<=100; x++)
  {
     File currentFile = file(parentFolder.toString() + "/file" + String.valueOf(x))
     currentFile.write(String.valueOf(Math.random()))
  }
}

第二阶段

接下来,假设我需要读取generateNumberFiles任务中生成的每个文件,并将每个文件压缩到第二个文件夹zipFolder中的单独存档中。为简单起见,我将它放在parentFolder下,但位置并不重要。

期望的输出:

parentFolder
|
|-file1
|-file2
...
|-file100
|-zipFolder
  |
  |-file1.zip
  |-file2.zip
  ...
  |-file100.zip

这似乎有问题,因为理论上,我需要为每个文件创建一个Zip任务(为每个文件生成一个单独的存档)。所以我想这是问题的第一部分:如何创建一个单独的任务来处理在先前任务期间生成的一堆文件,并将该任务作为构建过程的一部分运行?

在执行时添加任务肯定是可能的,但是让任务运行似乎更成问题。我已经读过使用.execute()是不可取的,从技术上讲它是一个内部方法。

我还想过将dependsOn添加到带有.matching { Task task -> task.name.startsWith("blah")}块的后续任务中。这似乎不起作用,因为在[Gradle配置阶段] [1]期间解决了任务依赖性。那么如何创建操作这些文件的任务,因为它们在配置时不存在?

第三阶段

最后,让我们复杂一点,并说我需要对第二阶段生成的ZIP档案执行一些其他自定义操作,这些内容不是内置于Gradle中的。我想不出一个现实的例子,所以我只想说我必须读取每个ZIP的第一个字节并将其上传到某个服务器 - 这涉及到每个ZIP独立操作。

第三阶段只是我在第二阶段的问题的延续。我觉得Gradle-y做这种事情的方法是创建任务,对每个文件执行一个单元的工作,并使用一些依赖来使这些任务执行。但是,如果构建依赖关系图时任务不存在,我该如何完成这类事情呢?另一方面,我是完全离开的还有其他方法可以做这种事吗?

[1]:“Gradle在任何任务执行之前构建完整的依赖图。” http://www.gradle.org/docs/current/userguide/build_lifecycle.html

2 个答案:

答案 0 :(得分:1)

您无法在执行阶段创建任务。正如您可能已经想到的那样,由于Gradle在配置阶段构建了任务执行图,因此您无法在以后添加任务。

如果您只是尝试将一个任务的输出作为另一个任务的输入,那么这就变成了一个简单的dependsOn关系,就像Ant一样。我相信你可能走错路径的地方是认为你需要为你想要创建的每个档案动态创建一个Gradle Zip任务。在这种情况下,由于您要创建的存档数量是基于另一个任务的输出(即在执行期间确定)的动态,您只需创建一个创建所有这些zip文件的任务即可。完成此操作的最简单方法就是通过Gradle&#39; Ant support使用Ant的zip任务。

答案 1 :(得分:1)

我们做类似的事情。虽然马克维埃拉的答案是正确的,但可能有一种方法可以调整两端的东西。具体做法是:

  1. 您可以像我们一样发现在配置阶段需要创建的所有zip文件。这将允许您创建任意数量的zip任务,适当地命名它们并正确地关联它们。这还允许您根据需要单独构建它们,并利用最新检查的增量构建支持。

  2. 如果你有什么需要做的事情才能发现你需要的东西(1)和如果相对简单,你可以编码特别是不作为任务而是作为配置步骤。

  3. 请注意&#34; Gradle-y&#34;方式是灵活的,但不要因为你可能觉得这是&#34; Gradle-y&#34;而不是这样做。做对了。如果您希望能够单独调用和关联它们,则需要单独的任务,或者通过跳过最新的任务来优化构建性能。如果这不是您关心的问题,请不要担心将每个文件放入自己的任务中。