gradle自定义任务

学习资料 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)

未完待续~~~~

猜你喜欢

转载自blog.csdn.net/yue530tomtom/article/details/79424419