42

我有一个非常简单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()
    }
}

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

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

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

4

5 回答 5

30

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

编辑:

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

gradle.projectsEvaluated {
    compileJava.dependsOn(generateSources)
}

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

于 2013-05-31T08:49:23.170 回答
28

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

afterEvaluate {
  android.applicationVariants.all { variant ->
    variant.javaCompiler.dependsOn(generateSources)
  }
}
于 2016-03-31T12:57:17.770 回答
15

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

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

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

于 2014-06-23T13:20:28.007 回答
7

尝试这个:

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”任务

于 2016-02-17T20:37:13.097 回答
0

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

在根项目中build.gradle

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

它也将为每个构建变体执行。

摇篮 4.1

于 2018-02-16T12:27:50.497 回答