我有一个非常简单的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
对于那些拥有多项目构建并且需要在构建之前为每个项目运行任务的人(但如果您只有应用程序项目也应该是可以的),您可以在allprojects
闭包内的根构建配置脚本中编写任务并在那里执行任务。
根项目build.gradle
:
allprojects {
repositories {
// ...
}
// ...
task mytask {
doFirst {
println project.projectDir.name
}
}
mytask.execute()
}
它将对每个构建变量执行。
4.1 Gradle