如何调用 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.

的任务

我该怎么做? (或者我只是偏离基地尝试这样做?)

我注意到了一些相当奇怪的事情...

  1. 类 中的方法名称(例如“printHello”)似乎无关紧要:任何合理的名称都会产生相同的输出 (?)。
  2. 当通过 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