2013-10-25 69 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 
    } 
} 

第一种方法是动态的,而第二种方法更简单。