2013-10-25 65 views
14

我在想如何在gradle中添加對特定productFlavor和buildType的依賴關係。 例如我有productFlavor free和生成類型release,我如何添加對assembleFreeRelease任務的依賴關係?在gradle中添加對特定productFlavor和buildType的依賴關係

我試過很多變種,但都不起作用。

比如我想:

task('release', dependsOn: assembleProductionRelease) { 
} 
// error: Could not find property 'assembleProductionRelease' on root project 'app'. 

或者:

task('release', dependsOn: 'assembleProductionRelease') { 
} 

這裏沒有錯誤,但任務是爲每一種滋味執行和建設型,非常混亂。

回答

12

這些任務是根據您的Android插件配置動態生成的。在配置時,它們還沒有提供給你。您可以通過兩種方式推遲創建您的任務:

等到project is evaluated

afterEvaluate { 
    task yourTask(dependsOn: assembleFreeRelease) { 
     println "Your task" 
    } 
} 

Lazily declaring the task dependency爲String。

task yourTask(dependsOn: 'assembleFreeRelease') { 
    println "Your task" 
} 
3

Muschko的回答並沒有爲我工作,所以這是我的解決方案,由我here

定義應只在一個特定的被執行的任務撰寫和張貼。 buildType/variant/flavor

task doSomethingOnWhenBuildProductionRelease << { 
    //code 
} 

使用「」很重要<「語法,否則每次都會自動調用該任務。

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

tasks.whenTaskAdded { task -> 
    if (task.name == 'assembleProductionRelease') { 
     task.dependsOn doSomethingOnWhenBuildProductionRelease 
    } 
} 
0
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

這裏是另一種方式,我用:

tasks.withType(JavaCompile) { 
    compileTask -> 
    def dependedTaskName = "dependedTask_"; 
    if(compileTask.name.contains('Release') { 
     dependedTaskName += "Release"; 
    } 
    createTask(dependedTaskName, Exec) { 
    ........ 
    } 

    compileTask.dependsOn ndkBuildTaskName 
} 

另一種方式:

tasks.whenTaskAdded { task -> 
    if (task.name == 'generateReleaseBuildTypeBuildConfig') { 
     task.dependsOn doSomethingForReleaseBuild 
    } 
} 

第一種方法是動態的,而第二種方法更簡單。