Android Studio / Gradle:在编译之前运行外部工具

时间:2015-04-24 10:33:43

标签: android gradle

我有一个Android Studio项目,它包含几个模块。

其中一些模块需要在编译之前运行外部预处理工具。另外,每次编译项目中的任何模块时,我还需要在项目范围内运行另一个工具

不幸的是,我是Gradle的新手,我有点不知所措。我已经通过编辑settings.gradle成功地在我的项目中包含了一个新的Gradle脚本,并且我在其中写了一些运行我想要运行的工具的Gradle任务,这很好。 但问题是我不明白如何将它们连接起来,以便它们在正确的时刻被执行。

基本上,我想知道如何编辑我的构建脚本以便:

A)始终在构建项目中的任何模块之前运行某个gradle任务 。 (如果可能的话,我希望它只运行一次,因为如果我重建整个项目,它由20多个模块组成,我不希望它运行20次,只需一次。这是次要的因此,最重要的是每次构建项目中的任何模块时都需要运行 B)始终在构建某个模块之前运行某个gradle任务。换句话说:如何在编译之前编辑单个特定模块的构建脚本以运行某个任务?请注意,在这种情况下,调用的任务需要能够知道哪个gradle项目调用了它,即:正在编译哪个模块。

希望问题清楚,如果有必要,我会澄清(正如我所说,我是Gradle的新手,希望我没有太多搞乱术语)

1 个答案:

答案 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
}

希望这有帮助,玩得开心:)