【问题标题】:How to invoke a method in Custom Gradle Task?如何在自定义 Gradle 任务中调用方法?
【发布时间】:2021-06-30 15:00:02
【问题描述】:

我正在尝试构建一个自定义 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”接受一个字符串作为参数。

A 类用于以下任务:

task helloA(type:HelloClassA) { }

并被调用,例如,

gradlew.bat helloA  

它工作正常并打印“Hello, World!”到构建窗口。但是,我无法弄清楚调用 B 类的任务的语法。

我该怎么做? (或者我只是想这样做吗?)

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

  1. 类中方法的名称(例如“printHello”)似乎无关紧要:任何合理的名称都会产生相同的输出 (?)。
  2. 通过 gradlew.bat 调用时,任务名称的任何明确子字符串的工作方式相同,例如,“GRADLEW helloA”或“GRADLEW hell”。我想这只是 GRADLE 试图提供帮助(?)。

【问题讨论】:

标签: android gradle android-gradle-plugin build.gradle


【解决方案1】:

您不能直接将它作为参数传递给方法。但是,如果您希望有一种方法可以使用 @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

【讨论】:

  • 完美运行。谢谢!
【解决方案2】:

可以将参数直接传递给方法而不使用属性。方法如下:

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 )

执行“我的任务”

gradlew.bat mytask  

产生输出

Processing "Hello, World!", 123

【讨论】:

  • 这实际上是构造函数参数,而不是方法参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多