在Android / Gradle中如何定义一个只有在构build特定的buildType / buildVariant / productFlavor(v0.10 +)时才运行的任务

针对Gradle的Android插件为每个BuilType / Flavor / BuildVariant生成一个任务。 问题是,这个任务将被dynamic地生成,因此在定义这样一个任务时不能作为一个依赖:

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

从这个答案build议的解决方法是这样的

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

或这个

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

但是两者都不适合我。

Solutions Collecting From Web of "在Android / Gradle中如何定义一个只有在构build特定的buildType / buildVariant / productFlavor(v0.10 +)时才运行的任务"

下面是一个完整的例子,如何做到这一点启发这个post 🙁 Android的插件v.0.9.2和Gradle 1.11在写作时)

我们将定义一个只有在构build“debugCustomBuildType”时才运行的任务

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

定义只应在特定的builtType / variant / flavor上执行的任务

 task doSomethingOnWhenBuildDebugCustom { doLast { //task action } } 

当gradle添加任务时,dynamic设置依赖关系

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

这里我们使用“generateBuildConfig”任务,但是您可以使用任何适合您的任务( 另请参阅官方文档 )

  • processManifest
  • aidlCompile
  • renderscriptCompile
  • mergeResourcess。
  • mergeAssets
  • processResources
  • generateBuildConfig
  • javaCompile
  • processJavaResources
  • 集合

不要忘记使用buildTypeSpecific任务( generateBuildConfiggenerateDebugCustomBuildTypeBuildConfig

就是这样。 这是一个耻辱,这个解决方法没有很好的文档,因为对我来说这似乎是一个构build脚本的最简单的要求之一。

我是这样实现的:

 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 } } 

坦率地说,我并没有使用哪种语言环境来为编译生成名字,所以toLowerCase(Locale.US)可能适得其反。

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

这是为我工作的唯一解决scheme:

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