自定义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任务。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/81748780