Groovy 在一个Gradle任务中生成要由另一个Gradle任务操作的文件

Groovy 在一个Gradle任务中生成要由另一个Gradle任务操作的文件,groovy,gradle,Groovy,Gradle,我第一次和Gradle一起做一个项目,在我的上一个项目中我来自Ant。到目前为止,我喜欢我所看到的,尽管我正试图弄明白如何做一些让我有些困惑的事情。我想知道在下面的情况下应该使用什么样的模式 我有一系列文件,需要对这些文件执行许多操作。每个任务都对它之前的任务的新生成的输出文件进行操作。我将尝试设计一个例子来演示我的问题,因为我的项目有点复杂和内部的 第一阶段 首先,假设我有一个任务,必须写出100个单独的文本文件,每个文件中有一个随机数。文件名并不重要,假设它们都将位于parentFolder

我第一次和Gradle一起做一个项目,在我的上一个项目中我来自Ant。到目前为止,我喜欢我所看到的,尽管我正试图弄明白如何做一些让我有些困惑的事情。我想知道在下面的情况下应该使用什么样的模式

我有一系列文件,需要对这些文件执行许多操作。每个任务都对它之前的任务的新生成的输出文件进行操作。我将尝试设计一个例子来演示我的问题,因为我的项目有点复杂和内部的

第一阶段 首先,假设我有一个任务,必须写出100个单独的文本文件,每个文件中有一个随机数。文件名并不重要,假设它们都将位于parentFolder下

例如:

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

我认为我的第一步应该是在doLast内部的一个循环中完成这项工作(快捷键为),您无法在执行阶段创建任务。正如您可能已经了解到的,由于Gradle在配置阶段构建了任务执行图,因此您以后无法添加任务


如果您只是试图将一个任务的输出用作另一个任务的输入,那么这就变成了一种简单的依赖关系,就像Ant一样。我相信,您可能走错了方向,因为您认为需要为每个要创建的存档动态创建Gradle
Zip
任务。在这种情况下,因为您将创建的存档数量是基于另一个任务的输出动态的(即,在执行期间确定)你可以简单地创建一个任务来创建所有这些zip文件。最简单的方法是通过Gradle's使用Ant的zip任务。

我们做了类似的事情。虽然Mark Vieira的答案是正确的,但可能有一种方法可以调整两端的内容。具体来说:

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

  • 如果您在发现(1)所需内容之前需要做一些事情,并且这相对简单,那么您可以专门将其编码为配置步骤而不是任务


  • 请注意,“Gradle-y”方式是灵活的,但不要仅仅因为你觉得这是“Gradle-y”就这样做。做正确的事。如果希望能够单独调用和关联它们,您需要单独的任务,也许可以通过跳过最新的任务来优化生成性能。如果这不是您所关心的,请不要担心将每个文件都变成自己的任务。

    谢谢您的回答,Mark,很高兴听到关于该任务的确认创建。至于使用Ant的zip任务,似乎使用Ant任务的目的更多是为了与旧版本兼容,但我可能错了。因为这是一个新项目,我更喜欢保持干净的渐变(没有Ant)如果我可以的话,我的想法是Gradle必须有某种方法来处理这个场景。也许Ant是唯一的方法?不一定。除了编写自定义任务之外,我看不到其他方法可以用一个任务创建多个存档,这取决于您的用例。实际上,Gradle
    Zip
    task使用的是Ant,因此它们在功能上应该是相同的。使用Gradle task的优点是Gradle DSL的简洁性和更好的增量构建支持。如果我编写了一个自定义任务,我已经完成了一些自定义处理,我可以利用Gradle的内置任务操作,例如Zip、上载、War等吗?或者基本上需要在我的自定义任务中重写这些操作吗?我完全理解你关于增量构建支持的观点,因为我期待着这种能力,我不确定是否/如何在这些动态场景中使用它。你可以扩展
    Zip
    任务,但同样,这是为了创建单个存档。你可以添加只能使用Gradle internal
    ZipCopyAction
    ,但这是一个内部API,可能不应该使用。你也可以使用Java库,如commons io。我个人会选择Ant选项。它是一个公共API,与Gradle捆绑在一起,并提供你想要的功能。你仍然可以编写自定义任务,实现(即
    @TaskAction
    )将简单地委托给Ant。
    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()))
      }
    }
    
    parentFolder
    |
    |-file1
    |-file2
    ...
    |-file100
    |-zipFolder
      |
      |-file1.zip
      |-file2.zip
      ...
      |-file100.zip