2013-05-31 115 views
32

編譯之前運行的任務,我有一個非常簡單的build.gradle文件,內容如下:採用Android搖籃插件

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任務。我發現了幾個解決方案是如何做到這一點,像​​3210,但不幸的是他們給了一個錯誤:

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

我不知道搖籃,搞不懂這有什麼錯此代碼。所以我想知道我如何解決這個錯誤。

+0

我認爲在這個線程,你會發現解決 [assembleRelease任務相關性 - 詢問庫密碼] [1] [1]:http://stackoverflow.com/questions/17144878/ assemblerelease-task-dependency-ask-for-keystore-password – skyrylyuk

回答

22

運行在Android上的Java編譯前一個任務的正確方法是根據你的任務爲每個變體編寫一個編譯任務。

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

您在哪裏調用您的自定義任務? –

+1

'generateSources'是自定義任務。 'javaCompiler'任務依賴於'generateSources'。 – Michael

+0

我收到一個錯誤:**找不到屬性'android'在根項目** –

27

顯然,android插件不會添加compileJava任務(如java插件會)。您可以使用gradle tasks --all來檢查哪些任務可用,併爲您的(否則正確的)依賴聲明選擇正確的任務。

編輯:

顯然,android插件推遲以這樣的方式,他們不能被急切地像往常一樣訪問任務的創建。解決這個問題的一種方法是推遲訪問,直到配置階段結束:

gradle.projectsEvaluated { 
    compileJava.dependsOn(generateSources) 
} 

有機會,有解決您的使用情況下,更地道的方式,但很快瀏覽Android plugin docs我不能」找到一個。

+0

我試圖做到這一點,但它也不起作用。 – Michael

+0

這是什麼不起作用,什麼是確切的錯誤信息? –

+2

問題是和以前一樣:'無法在根項目「Android'.' – Michael

10

您可以在終端運行任務中看到任務執行,例如gradle assemble。試試這個,它幾乎在任何事情之前開始。

gradle.projectsEvaluated { 
    preBuild.dependsOn(generateSources) 
} 

編輯,這可能不是Android Studio中工作,因爲Android的搖籃DSL沒有projectsEvaluated方法。

+0

什麼?我得到一個錯誤:**無法在根項目上找到屬性'preBuild'** –

+0

因此,它現在可能不會在較新版本的Gradle上存在 – zest

+0

它是否曾經存在於Android Studio中?還是你通常談論的搖籃...... –

2

試試這個:

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這個乾淨時,他們將調用「generateSources」任務

+0

我收到一個錯誤:**無法在項目中找到屬性'preBuild':app'** –

1

對於那些具有多項目構建和需要運行的每個項目任務他們正在建造之前(但也應該沒問題,如果你只有應用項目),可以編寫任務在allprojects關閉中的根構建配置腳本中,並在那裏執行任務。

在根項目build.gradle

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

它將爲每一個構建變量被執行爲好。

Gradle 4。1