使用Android Gradle插件在编译前运行task



我有一个非常简单的build.gradle文件,内容如下:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4.1'
    }
}
apply plugin: 'android'
android {
    buildToolsVersion "17.0.0"
    compileSdkVersion 17
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}
task generateSources {
    doFirst {
        def script = "python GenerateSources.py".execute()
        script.in.eachLine {line -> println line}
        script.err.eachLine {line -> println "ERROR: " + line}
        script.waitFor()
    }
}

我想要在java编译开始之前运行generateSources任务。我找到了几个解决方案,如何做到这一点,如compileJava.dependsOn("generateSources"),但不幸的是,他们给出了一个错误:

A problem occurred evaluating root project 'Android'.
> Could not find property 'compileJava' on root project 'Android'.

我不懂Gradle,不明白这段代码出了什么问题。所以我想知道我怎么能解决这个错误。

显然,android插件不添加compileJava任务(像java插件一样)。您可以检查gradle tasks --all中哪些任务可用,并为您的依赖声明选择正确的(否则是正确的)。

编辑:

显然,android插件延迟了任务的创建,使得它们不能像往常一样被急切地访问。克服这个问题的一种方法是将访问延迟到配置阶段:

结束。
gradle.projectsEvaluated {
    compileJava.dependsOn(generateSources)
}

有可能有一个更习惯的方法来解决你的用例,但快速浏览Android插件文档我找不到一个。

在Android上编译Java之前运行任务的正确方法是根据你的任务为每个变体创建一个编译任务。

afterEvaluate {
  android.applicationVariants.all { variant ->
    variant.javaCompiler.dependsOn(generateSources)
  }
}

您可以在终端运行任务gradle assemble中看到任务执行情况。试试这个,它实际上是在任何事情之前开始的。

android {
    ...
    gradle.projectsEvaluated {
         preBuild.dependsOn(generateSources)
    }
    ...
}

编辑,这可能无法在Android Studio中工作,因为Android Gradle DSL没有projectsEvaluated方法。

试试这个:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4.1'
    }
}
apply plugin: 'android'
android {
    buildToolsVersion "17.0.0"
    compileSdkVersion 17
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}
task generateSources {
    def script = "python GenerateSources.py".execute()
    script.in.eachLine {line -> println line}
    script.err.eachLine {line -> println "ERROR: " + line}
    script.waitFor()
}
project.afterEvaluate {
    preBuild.dependsOn generateSources
}
clean.dependsOn generateSources
clean.mustRunAfter generateSources

最后两行是可选的——它们将在执行gradle clean

时调用"generateSources"任务。

对于那些拥有多项目构建并且需要在构建之前为每个项目运行任务的人(但如果您只有应用程序项目也应该是可以的),您可以在allprojects闭包内的根构建配置脚本中编写任务并在那里执行任务。

根项目build.gradle:

allprojects {
    repositories {
        // ...
    }
    // ...
    task mytask {
        doFirst {
            println project.projectDir.name
        }
    }
    mytask.execute()
}

它将对每个构建变量执行。

4.1 Gradle

最新更新