如何调用 Custom Gradle Task 中的方法?
How to invoke a method in Custom Gradle Task?
我正在尝试构建自定义 Gradle 任务来执行一些应用程序维护操作。我想将参数传递给任务以控制操作。为了说明我的困境,请考虑以下两个简单的自定义任务 类:
// Custom task with no arguments
public class HelloClassA extends DefaultTask {
@TaskAction
public void printHello()
{
println "Hello, World!"
}
}
// Custom task with one argument
public class HelloClassB extends DefaultTask {
@TaskAction
public void printMsg(String msg)
{
println msg
}
}
除了“A”打印硬编码字符串而“B”接受字符串作为参数外,它们是相同的。
Class A 用于以下任务:
task helloA(type:HelloClassA) { }
并被调用,例如,
gradlew.bat helloA
它工作正常并打印“Hello, World!”到构建 window。但是,我不知道语法是用于调用 Class B.
的任务
我该怎么做? (或者我只是偏离基地尝试这样做?)
我注意到了一些相当奇怪的事情...
- 类 中的方法名称(例如“printHello”)似乎无关紧要:任何合理的名称都会产生相同的输出 (?)。
- 当通过 gradlew.bat 调用时,任务名称的任何明确子字符串都相同,例如,“GRADLEW helloA”或“GRADLEW hell”。我想这只是 GRADLE 试图提供帮助 (?)。
您不能直接将其作为参数传递给该方法。但是,如果您希望有一种使用 @Input
注释的方法。
以下是您的用例示例:
abstract class HelloClassB extends DefaultTask {
@Input
abstract Property<String> getMsg()//this is an abstract method to get values
@TaskAction
def printMsg() {
println msg.get() // here we get the value set from task.register
}
}
// printB is the task name
tasks.register('printB',HelloClassB) {
msg = 'Hello B' // here we set the Input value
}
现在在您的终端中 运行:gradlew -q printB
如果您想阅读更多相关信息,请查看此处:https://docs.gradle.org/current/userguide/custom_tasks.html
您可以将参数直接传递给方法而不使用属性。方法如下:
apply plugin: 'com.android.application'
import javax.inject.Inject
abstract class CustomTask extends DefaultTask {
@Inject
CustomTask(String message,int number) {
println "Processing \""+message+"\", "+number // process args
}
}
在附加参数的 android 部分中创建任务 'mytask'(必须在数量和格式上与任务定义一致):
tasks.register( 'mytask', CustomTask, 'Hello, World!', 123 )
由
执行'mytask'
gradlew.bat mytask
产生输出
Processing "Hello, World!", 123
我正在尝试构建自定义 Gradle 任务来执行一些应用程序维护操作。我想将参数传递给任务以控制操作。为了说明我的困境,请考虑以下两个简单的自定义任务 类:
// Custom task with no arguments
public class HelloClassA extends DefaultTask {
@TaskAction
public void printHello()
{
println "Hello, World!"
}
}
// Custom task with one argument
public class HelloClassB extends DefaultTask {
@TaskAction
public void printMsg(String msg)
{
println msg
}
}
除了“A”打印硬编码字符串而“B”接受字符串作为参数外,它们是相同的。
Class A 用于以下任务:
task helloA(type:HelloClassA) { }
并被调用,例如,
gradlew.bat helloA
它工作正常并打印“Hello, World!”到构建 window。但是,我不知道语法是用于调用 Class B.
的任务我该怎么做? (或者我只是偏离基地尝试这样做?)
我注意到了一些相当奇怪的事情...
- 类 中的方法名称(例如“printHello”)似乎无关紧要:任何合理的名称都会产生相同的输出 (?)。
- 当通过 gradlew.bat 调用时,任务名称的任何明确子字符串都相同,例如,“GRADLEW helloA”或“GRADLEW hell”。我想这只是 GRADLE 试图提供帮助 (?)。
您不能直接将其作为参数传递给该方法。但是,如果您希望有一种使用 @Input
注释的方法。
以下是您的用例示例:
abstract class HelloClassB extends DefaultTask {
@Input
abstract Property<String> getMsg()//this is an abstract method to get values
@TaskAction
def printMsg() {
println msg.get() // here we get the value set from task.register
}
}
// printB is the task name
tasks.register('printB',HelloClassB) {
msg = 'Hello B' // here we set the Input value
}
现在在您的终端中 运行:gradlew -q printB
如果您想阅读更多相关信息,请查看此处:https://docs.gradle.org/current/userguide/custom_tasks.html
您可以将参数直接传递给方法而不使用属性。方法如下:
apply plugin: 'com.android.application'
import javax.inject.Inject
abstract class CustomTask extends DefaultTask {
@Inject
CustomTask(String message,int number) {
println "Processing \""+message+"\", "+number // process args
}
}
在附加参数的 android 部分中创建任务 'mytask'(必须在数量和格式上与任务定义一致):
tasks.register( 'mytask', CustomTask, 'Hello, World!', 123 )
由
执行'mytask'gradlew.bat mytask
产生输出
Processing "Hello, World!", 123