首页 > 解决方案 > 如何在自定义 Gradle 任务中调用方法?

问题描述

我正在尝试构建一个自定义 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  

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

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

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

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

标签: androidgradleandroid-gradle-pluginbuild.gradle

解决方案


可以将参数直接传递给方法,而无需使用属性。就是这样:

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

推荐阅读