【问题标题】:Gradle use different tasks / arguments for each build typeGradle 为每种构建类型使用不同的任务/参数
【发布时间】:2015-12-14 17:30:53
【问题描述】:

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

作为构建过程的一部分,我有一些脚本应该在编译我的代码/构建 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'
}

理想情况下,我想通过 buildType(而不是 productFlavor)区分为基于构建类型而不是生成的应用程序所需的任务。

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

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

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

【问题讨论】:

    标签: android gradle


    【解决方案1】:

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

    ZXStudio 有一篇很好的博文/示例here,其中不使用属性或规则,而是迭代现有任务并根据 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2014-02-13
      • 2014-08-03
      • 1970-01-01
      相关资源
      最近更新 更多