【发布时间】:2014-09-04 23:22:06
【问题描述】:
我第一次在一个项目上使用 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
【问题讨论】: