我有一个包含多个模块的 Android Studio 项目。
其中一些模块在编译之前需要运行外部预处理工具。另外,每次编译项目中的任何模块时,我还需要在项目范围内运行另一个工具
不幸的是,我是 Gradle 的新手,我有点不知所措。我通过编辑 settings.gradle
成功地在我的项目中包含了一个新的 Gradle 脚本,并且我在其中编写了一些运行我想要运行的工具的 Gradle 任务,这很好。
但问题是我不明白如何将它们连接起来以便在正确的时间执行它们。
基本上,我想知道如何编辑我的构建脚本以便:
A) 始终在构建项目中的任何模块之前运行某个 gradle 任务。 (如果可能的话,我希望它只运行一次,因为如果我重建由 20 多个模块组成的整个项目,我不希望它运行 20 次,只运行一次。这是次要的不过,最主要的是它需要在每次构建项目中的任何模块时运行)
B) 总是 在构建某个模块之前运行某个 gradle 任务。换句话说:如何编辑单个特定模块的构建脚本以便在编译前运行特定任务?请注意,在这种情况下,调用的任务需要能够知道哪个 gradle 项目调用了它,即:正在编译哪个模块。
希望问题很清楚,如有必要我会澄清(正如我所说,我是 Gradle 的新手,希望我没有把术语弄乱太多)
最佳答案
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
}
希望这对您有所帮助,玩得开心:)
关于安卓工作室/ Gradle : run external tool before compilation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29845202/