2014-03-30 22 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 
     }) 
    } 
} 
相关问题