Android Gradle对每种生成类型使用不同的任务/参数

Android Gradle对每种生成类型使用不同的任务/参数,android,gradle,Android,Gradle,我正在使用实验性插件0.4.0将android项目迁移到gradle的早期阶段 作为构建过程的一部分,我有许多脚本应该在编译代码/构建apk之前运行。对于调试或发布版本,参数或任务本身将不同 我正在努力找到一个直截了当的方法来实现这一点 我已经把所有的东西都剥离回一个简单的hello world项目,同时我也明白了这一点 buildscript { repositories { jcenter() } dependencies { cla

我正在使用实验性插件0.4.0将android项目迁移到gradle的早期阶段

作为构建过程的一部分,我有许多脚本应该在编译代码/构建apk之前运行。对于调试或发布版本,参数或任务本身将不同

我正在努力找到一个直截了当的方法来实现这一点

我已经把所有的东西都剥离回一个简单的hello world项目,同时我也明白了这一点

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle-experimental:0.4.0'
    }
}

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"
    }

    android.buildTypes {
        debug {
            //
        }
        release {
            //runProguard, sign etc.
        }
    }

    android.productFlavors {
        create("free")
        {
            applicationId = "com.example.app.free"
            versionName = "1.0-free"
        }
        create("full")
        {
            applicationId = "com.example.app.full"
            versionName = "1.0-full"
        }
    }
}

repositories { 
    jcenter()
}

dependencies {
    compile 'joda-time:joda-time:2.7'
}

task runScript(type: Exec) {
    executable "sh"
    args "-c", "echo SomeScriptHere"
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn runScript
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.5'
}
理想情况下,我希望根据构建类型(而不是productFlavor)来区分所需的任务,因为这取决于构建类型,而不是生成的应用程序的种类

是否可以指定任务只能在发布版本或调试版本上运行

或者,是否可以根据发布版本或调试版本定义不同的参数以用于我的runScript任务

抱歉,如果我遗漏了一些明显的东西,我对使用gradle还很陌生。

使用onlyIf()可能是一种选择,但必须定义属性似乎很尴尬,尤其是当项目变得更大、更复杂时

ZXStudio有一个很好的博客文章/示例,它不使用属性或规则,而是迭代现有任务,并基于buildType/flavor创建一个新任务

因此,对于我最初的问题,答案意味着删除上面的runScript任务并替换tasks.withType(JavaCompile),如下所示

还可以扩展以匹配构建风格并适当地创建任务

tasks.withType(JavaCompile) {
    def newTaskName = "runScript_" + name;
    def isDebug = false;

    if( name.contains("Debug") )
    {
        isDebug = true;
    }

    //Create a new task
    tasks.create( newTaskName, Exec ) {
        if( isDebug )
        {
            executable "sh"
            args "-c", "echo this is a DEBUG task"
        }
        else 
        {
            executable "sh"
            args "-c", "echo this is a RELEASE task"
        }
    }

    dependsOn newTaskName
}