2014-03-30 20 views
22

針對Gradle的Android插件會爲每個BuilType/Flavor/BuildVariant生成一項任務。問題是,這個任務將動態生成並定義這樣的任務時,因此無法獲得作爲一個依賴:在Android/Gradle中如何定義只在構建特定buildType/buildVariant/productFlavor(v0.10 +)時運行的任務

task myTaskOnlyForDebugBuildType(dependsOn:assembleDebug) { 
    //do smth 
} 

從這個answer擬議的解決辦法是這個

task myTaskOnlyForDebugBuildType(dependsOn:"assembleDebug") { 
    //do smth 
} 

或這

afterEvaluate { 
    task myTaskOnlyForDebugBuildType(dependsOn:assembleDebug) { 
     //do smth 
    } 
} 

但這兩個都沒有爲我工作。

回答

34

這裏是如何做到這一點inspired by this post一個完整的例子:(Android插件v.0.9.2和gradle這個1.11在寫作的時候)

我們將定義任務,只有運行時,我們建立了一個「debugCustomBuildType」

android { 
    ... 
    buildTypes { 
     debugCustomBuildType { 
      //config 
     } 
    } 
} 

定義只應在特定builtType /株/風味執行任務

task doSomethingOnWhenBuildDebugCustom { 
    doLast { 
     //task action 
    } 
} 

動態設置的依賴性,當任務由gradle這個添加

tasks.whenTaskAdded { task -> 
    if (task.name == 'generateDebugCustomBuildTypeBuildConfig') { 
     task.dependsOn doSomethingOnWhenBuildDebugCustom 
    } 
} 

這裏我們使用「generateBuildConfig」的任務,但你可以使用你(also see official docs

  • processManifest工作的任何任務
  • aidlCompile
  • renderscriptCompile
  • mergeResourcess。
  • mergeAssets
  • processResources
  • generateBuildConfig
  • javaCompile
  • processJavaResources
  • 組裝

不要忘記使用buildTypeSpecific任務(generateBuildConfig對比generateDebugCustomBuildTypeBuildConfig

就是這樣。這是一個遺憾,這個解決方法沒有很好的文檔記錄,因爲對我來說這似乎是構建腳本最簡單的要求之一。

+0

的gradle這個團隊沒有一個真正偉大的工作... –

+1

這是否必須從命令行運行?或者當您按下綠色的「運行」按鈕時,Android Studio是否運行這些? –

+0

取決於buildType。通常情況下,綠色的「運行」按鈕構建調試buildType,如果你已經爲這個buildType設置了你的動作,它將被執行 - 不需要「命令行運行」 – for3st

6

我實現這樣的:

android { 
    ext.addDependency = { 
     task, flavor, dependency -> 
      def taskName = task.name.toLowerCase(Locale.US) 
      if (taskName.indexOf(flavor.toLowerCase(Locale.US)) >= 0) { 
       task.dependsOn dependency 
      } 
    } 

    productFlavors { 
     production { 
     } 
     other 
    } 

    task theProductionTask << { 
     println('only in production') 
    } 

    tasks.withType(JavaCompile) { 
     compileTask -> addDependency compileTask, "production", theProductionTask 
    } 
} 

坦率地說,我沒有哪個區域被用來生成編譯TAKS名稱,以便toLowerCase(Locale.US)可能會適得其反。

+0

我不知道任何包含非ascii字符的android gradle任務如果你保持你的名字也簡單地省略特殊字符到LowCase(Locale.US)應該是安全的。 – for3st

+0

當我不得不在模塊目錄外的自定義屬性文件中寫入值時,這對我也有用。 – Andreas

0

這僅僅是爲我工作的解決方案:

afterEvaluate { 
    if (project.hasProperty("preReleaseBuild")){ 
     tasks.preReleaseBuild.dependsOn bundleJSRelease 
    } else { 
     tasks.preDebugBuild.dependsOn bundleJSDebug 
    } 
} 
+0

在gradle build中的哪個點會運行afterEvaluate? –

1
tasks.whenTaskAdded { task -> 
    if (task.name.contains("assembleRelease")) { 
     task.getDependsOn().add({ 
      // add your logic here 
     }) 
    } 
} 
相關問題