Gradle学习系列之九——自定义Task类型

本文介绍了三种在Gradle中自定义Task类型的方法:直接在build.gradle文件中定义、在当前项目的buildSrc目录下定义以及在独立项目中定义并作为依赖引入。通过示例HelloWorldTask展示了每种方法的具体实现。

在前面的文章中我们讲到,Gradle本身只是一个架子,真正起作用的是Task和Plugin。要真正了解Task和Plugin的工作机制并熟练运用,学会自定义Task类型和Plugin是大有裨益的。

 

Gradle中的Task要么是由不同的Plugin引入的,要么是我们自己在build.gradle文件中直接创建的。在默认情况下,我们所创建的Task是DefaultTask类型,该类型是一个非常通用的Task类型,而在有些时候,我们希望创建一些具有特定功能的Task,比如Copy和Jar等。还有时候,我们希望定义自己创建的Task类型,在本文中,我们以定义一个简单的HelloWorldTask为例,讲解如何自定义一个Task类型,并且如何对其进行配置。

 

在Gradle中,我们有3种方法可以自定义Task类型。

 

(1)在build.gradle文件中直接定义

我们知道,Gradle其实就是groovy代码,所以在build.gradle文件中,我们便可以定义Task类。

 

复制代码
class HelloWorldTask extends DefaultTask {
    @Optional
    String message = 'I am davenkin'

    @TaskAction
    def hello(){
        println "hello world $message"
    }
}

task hello(type:HelloWorldTask)


task hello1(type:HelloWorldTask){
   message ="I am a programmer"
}
复制代码

 

在上例中,我们定义了一个名为HelloWorldTask的Task,它需要继承自DefaultTask,它的作用是向命令行输出一个字符串。@TaskAction表示该Task要执行的动作,即在调用该Task时,hello()方法将被执行。另外,message被标记为@Optional,表示在配置该Task时,message是可选的。在定义好HelloWorldTask后,我们创建了两个Task实例,第一个hello使用了默认的message值,而第二个hello1在创建时重新设置了message的值。

 

在执行hello时,命令行输出如下:

 

:hello
hello world I am davenkin

BUILD SUCCESSFUL

Total time: 2.139 secs

 

在执行hello1时,命令行输出如下:

 

:hello1
hello world I am a programmer

BUILD SUCCESSFUL

 

(2)在当前工程中定义Task类型

在(1)中,我们在build.gradle中直接定义了Task的类型,这样将Task的定义和使用混在一起。在需要定义的Task类型不多时,我们可以采用这种方法,但是在项目中存在大量的自定义Task类型时,这就不见得是中好的做法了。一种改进方法是在另外的一个gradle文件中定义这些Task,然后再apply到build.gradle文件中。这里,我们将使用另一种方法:在buildSrc目录下定义Task类型,Gradle在执行时,会自动地查找该目录下所定义的Task类型,并首先编译该目录下的groovy代码以供build.gradle文件使用。

 

在当前工程的buildSrc/src/main/groovy/davenkin目录下创建HelloWorldTask.groovy文件,将(1)中对HelloWorldTask的定义转移到该文件中:

 

复制代码
package davenkin
import org.gradle.api.*
import org.gradle.api.tasks.*

class HelloWorldTask extends DefaultTask {
    @Optional
    String message = 'I am davenkin'

    @TaskAction
    def hello(){
        println "hello world $message"
    }
}
复制代码

 

这里,我们将HelloWorldTask定义在了davenkin包下,因此在build.gradle文件中引用该Task时,我们需要它的全名称:

 

task hello(type:davenkin.HelloWorldTask)


task hello1(type:davenkin.HelloWorldTask){
    message ="I am a programmer"
}

 

以上的hello和hello1与(1)中的hello和hello1完成的功能相同。

 

(3)在单独的项目中定义Task类型

虽然(2)中的Task定义与build.gradle分离开了,但是它依然只能应用在当前工程中。如果我们希望所定义的Task能够用在另外的项目中,那么(2)中的方法便不可行的,此时我们可以将Task的定义放在单独的工程中,然后在所有使用Task的工程中通过声明依赖的方式引入这些Task。

 

创建另外一个项目,将(2)中buildSrc目录下的内容考到新建项目中,由于该项目定义Task的文件是用groovy写的,因此我们需要在该项目的build.gradle文件中引入groovy Plugin。另外,由于该项目的输出需要被其他项目所使用,因此我们还需要将其上传到repository中,在本例中,我们将该项目生成的包含了Task定义的jar文件上传到了本地的文件系统中。最终的build.gradle文件如下:

 

复制代码
apply plugin: 'groovy'
apply plugin: 'maven'
version = '1.0'
group = 'davenkin'
archivesBaseName = 'hellotask'

repositories.mavenCentral()

dependencies {
    compile gradleApi()
    groovy localGroovy()
}
uploadArchives {
    repositories.mavenDeployer {
        repository(url: 'file:../lib')
    }
}
复制代码

 

执行“gradle uploadArchives”,所生成的jar文件将被上传到上级目录的lib(../lib)文件夹中。

 

在使用该HelloWorldTask时,客户端的build.gradle文件可以做以下配置:

 

复制代码
buildscript {
    repositories {
        maven {
            url 'file:../lib'
        }

    }

    dependencies {
        classpath group: 'davenkin', name: 'hellotask', version: '1.0'
    }
}


task hello(type: davenkin.HelloWorldTask)
复制代码

 

首先,我们需要告诉Gradle到何处去取得依赖,即配置repository。另外,我们需要声明对HelloWorldTask的依赖,该依赖用于当前build文件。之后,对hello的创建与(2)中一样。

### Gradle 语言入门教程 #### 什么是 GradleGradle 是一种基于 Groovy 和 Kotlin 的构建工具,广泛应用于 Java、Android 及其他 JVM 生态系统的项目管理中。它通过声明式的 DSL(领域特定语言)来定义项目的配置和依赖关系[^2]。 --- #### 安装与环境准备 为了开始学习 Gradle,需先完成其安装并设置好开发环境。具体步骤可参考 Gradle 官方文档中的安装指南[^1]: 1. **下载 Gradle** 访问 [Gradle 下载页面](https://gradle.org/install/) 并根据操作系统选择合适的版本进行下载。 2. **配置环境变量** 将 `GRADLE_HOME` 添加到系统路径中,并确保命令行能够识别 `gradle` 命令。 3. **验证安装成功** 执行以下命令以确认安装无误: ```bash gradle --version ``` --- #### Gradle 构建文件基础 Gradle 使用两种主要的脚本格式:Groovy 或者 Kotlin 编写的构建脚本。默认情况下,大多数项目会采用 `.gradle` 文件作为构建脚本。 ##### 示例:基本的任务创建 下面是一个简单的例子,展示如何在 Gradle 中定义任务: ```groovy // build.gradle (Groovy 脚本) task hello { doLast { println 'Hello, Gradle!' } } ``` 运行此任务的方法为: ```bash gradle hello ``` 如果希望使用 Kotlin DSL,则可以这样编写相同的逻辑: ```kotlin // build.gradle.kts (Kotlin 脚本) tasks.register("hello") { doLast { println("Hello, Gradle!") } } ``` 上述代码展示了如何通过自定义任务实现简单功能[^4]。 --- #### 配置多模块项目 对于复杂的项目结构,通常需要支持多个子模块之间的协作。此时可通过以下方式配置父级和子级模块的关系: ```groovy // settings.gradle include ':app', ':core' ``` 这表示当前项目由两个模块组成——`:app` 和 `:core`。每个模块都可以拥有独立的 `build.gradle` 文件来进行单独配置[^3]。 --- #### 插件机制简介 插件是扩展 Gradle 功能的核心组件之一。例如,在 Android 开发中经常使用的 `com.android.application` 插件就是其中之一。应用插件的方式非常直观: ```groovy plugins { id 'java' version '7.0' } ``` 或者针对旧版语法: ```groovy apply plugin: 'java' ``` 以上片段表明启用了标准 Java 支持的功能集。 --- #### 监听器的应用场景 某些高级需求可能涉及监控特定事件的发生时间点。比如当所有子项目加载完成后触发操作时,可以用到监听器技术: ```groovy gradle.projectsLoaded { println "All projects have been loaded." } ``` 这段代码会在整个工程初始化完毕之后打印一条消息给终端用户查看。 --- #### 总结 本文介绍了关于 Gradle 初学者所需掌握的基础知识点,包括但不限于它的概念背景、实际运用案例以及部分进阶技巧等内容。随着实践深入,建议进一步探索官方手册获取更多细节说明。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值