我有一个Android Studio项目,它包含几个模块。
其中一些模块需要在编译之前运行外部预处理工具。另外,每次编译项目中的任何模块时,我还需要在项目范围内运行另一个工具
不幸的是,我是Gradle的新手,我有点不知所措。我已经通过编辑settings.gradle
成功地在我的项目中包含了一个新的Gradle脚本,并且我在其中写了一些运行我想要运行的工具的Gradle任务,这很好。
但问题是我不明白如何将它们连接起来,以便它们在正确的时刻被执行。
基本上,我想知道如何编辑我的构建脚本以便:
A)始终在构建项目中的任何模块之前运行某个gradle任务 。 (如果可能的话,我希望它只运行一次,因为如果我重建整个项目,它由20多个模块组成,我不希望它运行20次,只需一次。这是次要的因此,最重要的是每次构建项目中的任何模块时都需要运行 B)始终在构建某个模块之前运行某个gradle任务。换句话说:如何在编译之前编辑单个特定模块的构建脚本以运行某个任务?请注意,在这种情况下,调用的任务需要能够知道哪个gradle项目调用了它,即:正在编译哪个模块。
希望问题清楚,如果有必要,我会澄清(正如我所说,我是Gradle的新手,希望我没有太多搞乱术语)
答案 0 :(得分:1)
对A的回答是任务依赖性,我假设当你说模块意味着子项目时,你包含在settings.gradle中。如果所有这些子项目都要求先运行此任务,我将定义子项目:
subprojects {
apply plugin: 'java'
task precompiletask() {
println "Executing pre-compile task"
}
compileJava.dependsOn precompiletask
}
如果正确设置任务并输入/输出,您可以免费获得A的第二部分。这是gradle检查是否需要再次重新运行任务的内容。如果输入/输出没有任何变化,那么它将不会运行预编译任务并跳过它。
对于B部分,我要做的是在这些项目之间找到一个共同的属性并配置它们:
configure(someProjects()) {
// do whatever you want here to those projects
// for example, set up pre compile task like the one above
}
def someProjects() {
ext.someProjects = [] as Set
ext.someProjects.addAll subprojects.findAll { Project aProject ->
// filter here what's common with those projects
// for example, all projects that have yml file
}
logger.debug("Some projects [{}]", ext.someProjects)
ext.someProjects
}
希望这有帮助,玩得开心:)