使用参数从另一个调用一个 Gradle 任务
Call one Gradle Task from another with arguments
我有一个 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 来创建 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
您可以使用分机:
task outraTask << {
printf(arg0)
printf(arg1)
}
project(':projetc2').tasks.outraTask {
ext.arg0 = "0"
ext.arg1 = "1"
}.execute()
输出:
> Task :projetc2:outraTask
0
1
使用 GradleBuild API 的更漂亮的方法:
task ('taskA', type: GradleBuild) {
startParameter.projectProperties = ['ARGS':'arg1']
tasks = ['taskAll']
}
task ('taskB', type: GradleBuild) {
startParameter.projectProperties = ['ARGS':'arg2']
tasks = ['taskAll']
}
您可以拥有复杂的项目属性,例如命令行参数 -Pmyextension.config=true
将变为:
startParameter.projectProperties = ['myextension.config':true]
请注意,这将清除 CLI 参数。如果您需要附加它:
startParameter.projectProperties << project.getGradle().getStartParameter().getProjectProperties() << ['myextension.config':true]
我有一个 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 来创建 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
您可以使用分机:
task outraTask << {
printf(arg0)
printf(arg1)
}
project(':projetc2').tasks.outraTask {
ext.arg0 = "0"
ext.arg1 = "1"
}.execute()
输出:
> Task :projetc2:outraTask
0
1
使用 GradleBuild API 的更漂亮的方法:
task ('taskA', type: GradleBuild) {
startParameter.projectProperties = ['ARGS':'arg1']
tasks = ['taskAll']
}
task ('taskB', type: GradleBuild) {
startParameter.projectProperties = ['ARGS':'arg2']
tasks = ['taskAll']
}
您可以拥有复杂的项目属性,例如命令行参数 -Pmyextension.config=true
将变为:
startParameter.projectProperties = ['myextension.config':true]
请注意,这将清除 CLI 参数。如果您需要附加它:
startParameter.projectProperties << project.getGradle().getStartParameter().getProjectProperties() << ['myextension.config':true]