自定义Gradle任务教程

自定义Gradle任务

本文我们介绍如何在Gradle中自定义任务。通过构件脚本定义新任务或自定义任务类型。想了解Gradle请先阅读前文,包括Gradle基础知识以及Gradle中任务介绍。

在build.gradle中自定义任务

在build.gradle中可以直接定义任务:

task welcome {
    doLast {
        println 'Welcome in the Baeldung!'
    }
}

上面任务的主要目的是打印文字“Welcome in the Baeldung!”.我们可以运行 gradle tasks –all 命令检查这个任务是否有效。

gradle tasks --all

任务在Other tasks分组列表中:

Other tasks
-----------
welcome

如果你不加上–all选项,属于Other类别下任务不显示。自定义任务可以属于非“Other”组,也可以包含描述。

你可以象其他任务一样执行该任务:

gradle welcome

输出如期望一致: “Welcome in the Baeldung!”

设置任务组和描述

有时任务需要根据功能进行分组,主要在特定组中任务可见。定义任务时可以定义group属性用于设置分组:

task welcome {
    group 'Sample category'
    doLast {
        println 'Welcome on the Baeldung!'
    }
}

现在运行gradle命令显示所有任务(–all选项可以不再需要),可以看到任务在新的分组中:

Sample category tasks
---------------------
welcome

让人看到任务所属分组便于使用。我们也可以增加description属性,包含简短的描述信息:

task welcome {
    group 'Sample category'
    description 'Tasks which shows a welcome message'
    doLast {
        println 'Welcome in the Baeldung!'
    }
}

打印有效任务列表输出如下:

Sample category tasks
---------------------
welcome - Tasks which shows a welcome message

这种类型的任务定义称为即席定义。更一般情况,定义能够重用的任务比较有用。下面我们讨论如何从一些任务类型中派生新的任务,并增加自定义功能。

在build.gradle中定义gradle任务类型

上面“welcome”任务不能被自定义,因此不是很有用。可以运行该任务,但如果需要在不同项目(或子项目)中使用,那么需要拷贝、粘贴定义代码。

我们可以通过创建任务类型来自定义有效任务,我们仅仅在build脚本中定义任务类型:

class PrintToolVersionTask extends DefaultTask {
    String tool

    @TaskAction
    void printToolVersion() {
        switch (tool) {
            case 'java':
                println System.getProperty("java.version")
                break
            case 'groovy':
                println GroovySystem.version
                break
            default:
                throw new IllegalArgumentException("Unknown tool")
        }
    }
}

自定义任务类型是继承自DefaultType类的简单Groovy类,DefaultType类是定义标准任务实现。也有其他类型任务可以继承,但大多数情况,DefaultType类是较好的选择。

PrintToolVersionTask任务包含tool实现,其可在该任务实例中进行定制:

String tool

我们可以增加多个必要属性,它们仅是简单Groovy类的属性。另外,上面任务类包含@TaskAction的注解方法,其定义该任务需要做什么。该示例任务根据给定的参数打印java或groovy的版本值。

为了运行自定义任务类型,需要创建其实例:

task printJavaVersion(type : PrintToolVersionTask) {
    tool 'java'
}

需要说明两点:

  • 我们的任务是PrintToolVersionTask 类型,所以当运行任务时,会触发@TaskAction注解的方法
  • 指定自定义tool属性值java将用于PrintToolVersionTask

当我们运行上面任务,输出如下(依赖本地安装的java 版本):

> Task :printJavaVersion 
9.0.1

现在我们创建一个任务打印groovy版本:

task printGroovyVersion(type : PrintToolVersionTask) {
    tool 'groovy'
}

上面任务使用相同的任务类型,但指定不同的tool属性值,执行任务输出:

> Task :printGroovyVersion 
2.4.12

如果没有太多的自定义任务,可以直接定义在build.gradle中(如上面方式)。然而,如果build.gradle定义太多的任务会导致脚本难读难懂。

幸运的是Gradle提供其他解决方案。

在buildSrc文件夹中定义任务类型

我们可以在根项目中的buildSrc文件夹中定义任务类型,Gradle编译其中的定义并增加类型至类路径下,所以构建脚本中可以使用。

前面定义的任务类型 (PrintToolVersionTask) 可以移到 buildSrc/src/main/groovy/com/baeldung/PrintToolVersionTask.groovy. 我们需导入一些Gradle API至任务类中.

在文件夹中可以定义无限数量的任务类型.主要较容易维护、阅读,任务类型定义和任务一样不在相同地方。使用方式与在构建文件中定义一样,需要记住的是需要导入必要API。

总结

本文我们讨论了如何自定义gradle任务。

猜你喜欢

转载自blog.csdn.net/neweastsun/article/details/81748780