学习资料 Writing Custom Task Classes
概述
gradle中的Task生成有两种途径
- 由Plugin引入
- 在build.gradle文件中直接创建
这两种情况在之前的示例中都有演示,比如引入java插件,就可以应用java插件中定义的任务;在build.gradle中直接创建可以参考 构建脚本要素之task 这两种情况都不是本章节介绍的重点~,重点是改变我们创建的任务类型,我们所创建的Task的默认类型是DefaultTask,该类型是一个非常通用的Task类型,若需要具有特定功能的Task,如定义自己创建的Task类型,那默认类型就无能为力了,所以本章节尝试创建自己的任务类型
任务类源代码存放位置
Build script
可以在构建脚本中直接包含任务类。这样做的好处是可以自动编译任务类,并将其包含在构建脚本的类路径中,而无需做任何事情。然而,任务类在构建脚本之外是不可见的,因此您不能在构建脚本之外的构建脚本之外重用任务类。
buildSrc project
可以把任务类的源代码存放在rootProjectDir/buildSrc/src/main/groovy目录中。gradle将负责编译和测试任务类,并使其在构建脚本的类路径中可用。任务类对构建所使用的每个构建脚本都是可见的。但是,它在构建之外是不可见的,因此不能在它定义的构建之外重用任务类。使用buildSrc项目方法将任务声明——也就是任务应该做的——从任务实现中分离出来——也就是任务执行的方式。
Standalone project
可以为任务类创建一个单独的项目。这个项目生成并发布一个JAR,您可以在多个构建中使用它,并与其他版本共享。通常,这个JAR可能包含一些定制的插件,或者将几个相关的任务类捆绑到一个单独的库中。或者两者的结合。
自定义Task类型
要实现自定义任务类,需要继承DefaultTask DefaultTask详细说明
对应任务类型源代码存放的方式有三种方法可以自定义任务
在build.gradle文件中直接定义task类型
class UserDefined extends DefaultTask {
@TaskAction
def fun(){
println "I'm hererrrrrrrrrrr"
}
}
task testTask(type:UserDefined)
c:\>gradle testTask
:testTask
I'm hererrrrrrrrrrr
Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.5.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed
将一个方法添加到任务中,并使用TaskAction注释标记它。当任务执行时,Gradle将调用方法。不需要使用方法来定义任务的行为。如,可以在任务构造函数中调用doFirst()或doLast(),以添加行为
当然还可以为任务类型添加属性
class UserDefined extends DefaultTask {
String greeting = 'hello from GreetingTask'
@TaskAction
def fun(){
println "I'm hererrrrrrrrrrr"
}
}
//使用默认的字符串
task testTask(type:UserDefined)
//使用自定义的字符串
task greeting(type:UserDefined){
greeting = 'greetings from GreetingTask'
}
在当前工程中定义Task类型
在buildSrc目录下定义Task类型,Gradle在执行时,会自动地查找该目录下所定义的Task类型,并首先编译该目录下的groovy代码以供build.gradle文件使用。
- 先创建一个gradle工程
- 在当前工程的buildSrc/src/main/groovy/davenkin目录下创建UserDefined .groovy文件
- 编写任务类型代码
package userDefined.test.demo
import org.gradle.api.*
import org.gradle.api.tasks.*
class UserDefined extends DefaultTask {
String greeting = 'hello from GreetingTask'
@TaskAction
def fun(){
println "I'm hererrrrrrrrrrr"
}
}
在build.gradle文件中引用该Task时,需要它的全名称:
//使用默认的字符串
task testTask(type:userDefined.test.demo.UserDefined)
//使用自定义的字符串
task greeting(type:userDefined.test.demo.UserDefined){
greeting = 'greetings from GreetingTask'
}
单独的项目中定义Task类型
虽然第二种方式Task定义与build.gradle分离开了,但是它依然只能应用在当前工程中。如果我们希望所定义的Task能够用在另外的项目中,方法便不可行的,此时我们可以将Task的定义放在单独的工程中,然后在所有使用Task的工程中通过声明依赖的方式引入这些Task。
从定义到使用共三步:编写自定义任务、发布自定义任务、引用自定义任务
- 在工程源码包中新建文件(就是重复第二种做的事情了)
package userDefined.test.demo
import org.gradle.api.*
import org.gradle.api.tasks.*
class UserDefined extends DefaultTask {
String greeting = 'hello from GreetingTask'
@TaskAction
def fun(){
println "I'm hererrrrrrrrrrr"
}
}
- 修改build.gradle
apply plugin: 'groovy'
apply plugin: 'maven'
version = '1.0.0'
group = 'userDefinedtest'
archivesBaseName = 'userDefinedTask'
repositories.mavenCentral()
dependencies {
compile gradleApi()
groovy localGroovy()
}
uploadArchives {
repositories.mavenDeployer {
repository(url: 'file:../lib')
}
}
执行”gradle uploadArchives”,所生成的jar文件将被上传到上级目录的lib(../lib)文件夹中。
- 在其他项目中使用:build.gradle文件配置:
buildscript {
repositories {
maven {
url 'file:../lib'
}
}
dependencies {
classpath group: 'userDefinedtest', name: 'userDefinedTask', version: '1.0.0'
}
}
task test(type: userDefinedtest.UserDefined)
未完待续~~~~