使用Android Gradle插件在编译之前运行任务

Mic*_*ael 37 android gradle android-build

我有一个非常简单的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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

A problem occurred evaluating root project 'Android'.
> Could not find property 'compileJava' on root project 'Android'.
Run Code Online (Sandbox Code Playgroud)

我不知道Gradle,也无法理解这段代码有什么问题.所以我想知道如何解决这个错误.

Pet*_*ser 29

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

编辑:

显然,android插件延迟创建任务,以至于无法像往常一样急切地访问它们.解决此问题的一种方法是将访问推迟到配置阶段结束:

gradle.projectsEvaluated {
    compileJava.dependsOn(generateSources)
}
Run Code Online (Sandbox Code Playgroud)

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

  • 问题与以前一样:`无法在根项目'Android'上找到属性'compileDebug' (2认同)

Mic*_*ael 25

在Android上进行Java编译之前运行任务的正确方法是为每个变量创建一个编译任务取决于您的任务.

afterEvaluate {
  android.applicationVariants.all { variant ->
    variant.javaCompiler.dependsOn(generateSources)
  }
}
Run Code Online (Sandbox Code Playgroud)


Gen*_*kin 14

例如,您可以在终端运行任务中看到任务执行gradle assemble.尝试这个,它几乎在任何事情之前开始.

gradle.projectsEvaluated {
     preBuild.dependsOn(generateSources)
}
Run Code Online (Sandbox Code Playgroud)

编辑,这可能不适用于Android Studio,因为Android Gradle DSL没有projectsEvaluated方法.

  • @IgorGanapolsky只是将prebuild.dependsOn('someTask')放在android {}块中,就像一个魅力.无需调用projectsEvaluated. (3认同)

Phi*_*o99 5

尝试这个:

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
Run Code Online (Sandbox Code Playgroud)

最后两行是可选的-执行gradle clean时,它们将调用“ generateSources”任务

  • 我收到错误:**无法在项目“:app”上找到属性“preBuild”** (2认同)