gradle 编写自定义生成任务以在每个生成上自动生成生成依赖项

gzjq41n4  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(194)

我正在尝试弄清楚如何使用Gradle。我遇到了这个问题,在Makefiles、CMake等中解决这个问题很简单,但我不知道如何在Gradle中解决。
假设我有一个应用程序,其中包含一些资源文件,这些资源文件是从一组输入文件中生成的,并以编译后的形式放入应用程序中。
我希望指示Gradle在需要时自动生成这些资源,方法是将其指向资源输入文件。因此,实际上,我希望这样做:

all: out1 out2
    @echo done

out1: in1
    cat in1 | xxd > out1

out2: temp1
    cat temp1 | xxd > out2

temp1: in1
    cat in2 | tr '[:lower:]' '[:upper:]' > temp1

(let如果xxd将失败,则将生成无效的out1,则跳过此不幸的影响)
假设out1out2是我想要嵌入到应用程序中的资源文件,这两个文件由不同的规则生成:

  • out1是通过用xxd处理in1而从in1生成的(这只是一个示例),
  • out2是从in2生成的,首先将其大写,然后将其通过xxd。在此期间,将创建一个临时文件temp1,但这只是一个临时文件,一点也不重要。

因此,我想在Gradle中实现的基本上相当于上面粘贴的Makefile脚本及其所有功能;我的主要意思是,如果in1in2没有变化,就不应该生成out1out2(因为资源生成阶段可能是昂贵和耗时的,所以我希望避免在每个构建上都运行它),以及构建系统自动计算出如何并行运行构建的可能性,从而同时产生out1out2
我试图挖掘Gradle的文档和一些示例,但我发现的95%都是一些不透明的脚本,它们使用了一些特定的插件,没有人解释它在里面是如何工作的。文档说Gradle是一个“自动化工具”,所以它应该完全可以实现我试图实现的目标,但事实真的是这样吗?尝试将Gradle作为本文中描述的用例的工具有意义吗?

w9apscun

w9apscun1#

Gradle任务可以在运行时创建,据我所知,它需要在调用Gradle时准备好生成任务所需的输入(不确定一旦一个任务已经开始,是否还可以创建任务,我个人还没有尝试过)。
对于您的用例,您可能只需要在输入准备就绪后执行一个单独的gradle命令(单独的构建文件)。Gradle允许您调用任何shell命令,因此只需生成另一个gradle调用即可。
下面是一个关于如何动态创建新任务的示例(多个任务是从一个数组中派生出来的,您可以只从一个文件中读取您的任务):https://github.com/HCL-TECH-SOFTWARE/DX-Modules-and-ScriptApps/blob/main/06ThemeComponentInApp/DxModule/build.gradle

相关问题