在Android/Gradle中,如何定义仅在构建特定buildType/buildVariant/productFla



Android Plugin for Gradle为每个BuilType/Flavor/BuildVariant 生成一个任务。问题是此任务将动态生成,因此在定义如下任务时不会作为依赖项使用:

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

此答案的建议解决方法是

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

或者这个

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

但两者都对我不起作用。

以下是受

这篇文章启发的有关如何执行此操作的完整示例:(在撰写本文时,android 插件 v.0.9.2 和 gradle 1.11)

我们将定义一个仅在构建"debugCustomBuildType"时运行的任务

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

定义只应在特定构建类型/变体/风格上执行的任务

task doSomethingOnWhenBuildDebugCustom {
    doLast {
       //task action
    }
}

动态设置通过 gradle 添加任务时的依赖关系

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

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

  • 进程清单
  • 编译
  • 渲染脚本编译
  • 合并资源。
  • 合并资产
  • 流程资源
  • 生成构建配置
  • JavaCompile
  • 进程Java资源
  • 聚集

不要忘记使用buildTypeSpecific任务(generateBuildConfig vs。 generateDebugCustomBuildTypeBuildConfig

仅此而已。遗憾的是,这种解决方法没有很好的文档记录,因为对我来说,这似乎是构建脚本最简单的要求之一。

我是这样实现的:

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

坦率地说,我不知道使用哪个语言环境来生成编译 tak 的名称toLowerCase(Locale.US)因此可能会适得其反。

这是唯一对我有用的解决方案:

afterEvaluate {
    if (project.hasProperty("preReleaseBuild")){
        tasks.preReleaseBuild.dependsOn bundleJSRelease
    } else {
        tasks.preDebugBuild.dependsOn bundleJSDebug
    }
}
tasks.whenTaskAdded { task ->
    if (task.name.contains("assembleRelease")) {
        task.getDependsOn().add({
            // add your logic here
        })
    }
}

最新更新