使用参数从一个Gradle Task调用另一个Gradle Task [英] Call one Gradle Task from another with arguments

查看:39
本文介绍了使用参数从一个Gradle Task调用另一个Gradle Task的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Gradle任务,它调用一个脚本,并使用-PARGS将命令行参数传递给该脚本。

task taskAll(type: Exec, dependsOn: taskinit) {
    environment['PROJECT_ROOT'] = "${projectDir}"
    workingDir rootProject.projectDir.path
    description = 'Main task'

    executable rootProject.projectDir.path + "/execute.me"
    if (project.hasProperty('ARGS')) {
        args(ARGS.split(','))
    }
}

我使用以下任一选项调用此Gradle任务

./gradlew taskAll
./gradlew taskAll -PARGS="arg1"
./gradlew taskAll -PARGS="arg2"

不过,我想看看是否将TaskAll拆分成多个任务,比如

./gradlew taskA    #Calls task taskAll with arg1
./gradlew taskB    #Calls task taskAll with arg2

我知道我必须复制taskAll才能创建taskAtaskB并删除其中的"if"条件和硬编码参数。

但是,我想知道是否可以通过让MainTask只调用可执行文件,然后让TaskATaskBTaskC调用MainTask并传递参数arg1arg2arg3来实现更干净的实现。

推荐答案

在大多数情况下,通过提供dependsOn和可选的mustRunAfter属性,通过配置任务依赖项来执行来自另一个任务的任务。在您的情况下,不可能使用它,因为您的主任务必须在某些配置任务之后执行。在这种情况下,您可以使用任务的finalizedBy属性。

根据您的需求,您可以创建许多任务,这些任务将根据您的需要设置一些带有预定义参数的脚本变量。你可以离开你的主要任务,它将调用一些东西,依赖于这个论点。你唯一需要做的,就是让你的主要任务完成每一项自定义任务。因此,每次调用自定义任务都会在执行后执行主任务。

这里是一个简短的示例,如何操作:

//define a variable to store arguments
def ARGS = null

//2 custom tasks, which set arguments during the execution phase
task taskA << {
    ARGS = "poperty1,property2"
}

task taskB << {
    ARGS = "property3,property4"
}

//your main task
task mainTask (type: Exec) {
    environment['PROJECT_ROOT'] = "${projectDir}"
    workingDir rootProject.projectDir.path
    description = 'Main task'

    executable rootProject.projectDir.path + "/execute.me"

    //here is the main difference, we moved arguments setting into 
    //execution phase, before execution of this task
    doFirst{
        //if you call custom task it will be executed with predefined params
        if (ARGS != null) {
            args(ARGS)
        //if you call mainTask, you are able to pass arguments via command line with -PCOMMAND_LINE_ARGS=123
        } else if (project.hasProperty('COMMAND_LINE_ARGS')) {
            args(COMMAND_LINE_ARGS)
        } else {
            throw new GradleException("No arguments found")
        }
    }
}

//finilization settings for custom tasks
taskA.finalizedBy mainTask
taskB.finalizedBy mainTask

这篇关于使用参数从一个Gradle Task调用另一个Gradle Task的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆