自定义任务就是一个实现Task 接口的 Groovy类,该接口定义了大量抽象方法需要实现,因此一般自定义任务类会继承DefaultTask基类。自定义任务的Groovy类可以自定义多个方法,这些方法可作为Action使用。
自定义任务的Groovy类既可直接定义在 build.gradle文件中,也可使用专门的Groovy源文件定义。
新建gradle项目
构建文件
// 继承DefaultTask定义自定义任务
class HelloWorldTask extends DefaultTask {
@Optional
def message = '疯狂软件教育中心'
// 使用@TaskAction修饰的方法被自动当成Action
@TaskAction
def test(){
println "test:$message"
}
def info(){
println "info:$message"
}
}
task hello(type: HelloWorldTask){
doLast{
info()
}
}
task hello1(type: HelloWorldTask){
message = "疯狂java联盟"
}
通过命名 gradle hello运行工程

构建失败了
* What went wrong:
A problem was found with the configuration of task ':hello' (type 'HelloWorldTask').
- Type 'HelloWorldTask' property 'message' is missing an input or output annotation.
Reason: A property without annotation isn't considered during up-to-date checking.
粗略一看,什么什么缺失了,
试试编译器给我们的“可能”的解决办法


再试一次


没毛病。
上面这种自定义任务的方式虽然简单,但会使得自定义任务类被直接放在build.gradle文件中,从而导致build.gradle文件比较混乱。当自定义任务较少且比较简单时,可以采用这种方式,但是当自定义任务较多或比较复杂时,建议采用专门的 Groovy源文件来自定义任务。
自定义任务的源代码属于项目构建的源代码,因此 Gradle约定将这些源代码放在 buildSrc目录下。buildSrc目录就相当于另一个 Gradle项目,Gradle执行时会先构建buildSrc目录下的 Groovy源代码以供build.gradle文件使用。
package org.fkjava
import org.gradle.api.*
import org.gradle.api.tasks.*
/**
* ClassName: ShowTask
* date: 2022/8/13 15:24
* @author DingJiaxiong
*/
class ShowTask extends DefaultTask{
@Internal
File file = new File('dist.txt')
@TaskAction
def show(){
println file.text
}
@TaskAction
def multiShow(){
println "---------"
println file.text
println "---------"
}
}

构建文件
// 使用Groovy文件中的task
task show(type : org.fkjava.ShowTask)
task show1(type: org.fkjava.ShowTask){
//对file属性赋值
file = file("g:/gradletest.txt")
}
命令运行

所谓自定义插件,其实就是一个实现 Plugin接口的类,实现该接口要求必须实现apply(Project project)方法,接下来就可以在该方法中为Project添加属性和定义任务了——正如前面所介绍的,所谓插件,无非就是为 Project定义多个属性和任务,这样引入该插件后即可使用这些属性和任务。
直接在构建文件中定义一个自定义插件类
// 实现Plugin定义自定义插件
class FirstPlugin implements Plugin<Project> {
// 重写接口中apply方法
void apply(Project project){
// 为项目额外定义一个User类型的user属性
project.extensions.create("user", User)
// 调用task方法定义showName任务
project.task('showName') {
doLast{
println '用户名:' + project.user.name
}
}
// 调用tasks对象(TaskContainer)的create方法定义showPass任务
project.tasks.create('showPass') {
doLast {
println '密码:' + project.user.pass
}
}
}
}
class User {
String name = 'DingJiaxiong'
String pass = '123'
}
// 引入FirstPlugin插件
apply plugin: FirstPlugin
// 为Project的user属性的name属性赋值
user.name = "丁家雄"
运行命令 gradle showName

gradle showPass

与自定义任务类似的是,自定义插件其实也应该使用专门的Groovy源文件定义,这些用于自定义插件的Groovy类也应该被放在 buildSrc目录下。
itemPlugin.groovy
package org.fkjava
import org.gradle.api.*
/**
* ClassName: itemPlugin
* date: 2022/8/13 15:50
* @author DingJiaxiong
*/
class ItemPlugin implements Plugin<Project> {
// 重写接口中apply方法
void apply(Project project){
// 为项目额外定义一个Item类型的item属性
project.extensions.create("item", Item)
// 调用task方法定义showInfo任务
project.task('showItem') {
doLast{
println '商品名:' + project.item.name
println '商品销售价:' + project.item.price * project.item.discount
}
}
}
}
Item.groovy
package org.fkjava
/**
* ClassName: item
* date: 2022/8/13 15:55
* @author DingJiaxiong
*/
class Item {
String name = 'buzhidao'
double price = 0
double discount = 1.0
}
引入插件
// 引入org.fkjava.ItemPlugin插件
apply plugin: org.fkjava.ItemPlugin
// 为org.fkjava.ItemPlugin插件所扩展的项目属性赋值
item.name='疯狂Android讲义66666'
item.price = 108
item.discount = 0.75
运行命令,调用任务
