使用参数从另一个Gradle任务调用一个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
-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