Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用参数从另一个Gradle任务调用一个Gradle任务_Gradle_Build.gradle_Gradlew - Fatal编程技术网

使用参数从另一个Gradle任务调用一个Gradle任务

使用参数从另一个Gradle任务调用一个Gradle任务,gradle,build.gradle,gradlew,Gradle,Build.gradle,Gradlew,我有一个gradle任务,它调用脚本并使用-PARGS将命令行参数传递给脚本 task taskAll(type: Exec, dependsOn: taskinit) { environment['PROJECT_ROOT'] = "${projectDir}" workingDir rootProject.projectDir.path description = 'Main task' executable rootProject.projectDir.p

我有一个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任务称为具有以下任何选项的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来创建
taskA
taskB
,并删除其中每个中的“if”条件和硬编码参数


但是,我想知道是否有可能通过让只调用可执行文件的MainTask,然后让
TaskA
TaskB
TaskC
调用
MainTask
,并传递参数
arg1
arg2
arg3
,来实现更简洁的实现

在大多数情况下,通过提供
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
//定义一个变量来存储参数
def ARGS=null
//2个自定义任务,在执行阶段设置参数
任务任务a您可以使用ext:

task outraTask << {
    printf(arg0)
    printf(arg1)
}

project(':projetc2').tasks.outraTask {
    ext.arg0 = "0"
    ext.arg1 = "1"
}.execute()

在gradle中,本机不支持从一个任务调用另一个任务的执行,而且非常不鼓励这样做@Opal您的意思是,可以使用costMetask.execute()?是的,当然可以。为什么不呢?您可以在其他任务上调用execute。是完全有效的gradle脚本。@蛋白石是的,也许我的公式错了。但正如我所知,如果你可以通过任务依赖性来做这件事,那么这不是一个明智的方法。当然不是。这是我在第一条评论中写的:)
> Task :projetc2:outraTask
0
1