`
wbj0110
  • 浏览: 1602816 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

阅读更多

请通过以下方式下载本系列文章的Github示例代码:

git clone https://github.com/davenkin/gradle-learning.git

 


 

在前面的文章中我们讲到,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 是 Android 进阶绕不去的坎 —— Gradle 系列(1).doc

    ale 插件: 提供具体构建逻辑,如 Android 插件负责处理 Android 项目的构建细节; Project: 表示一个独立的构建项目,可以包含多个子 ...通过逐步深入学习 Gradle 系列文章,你将能够更好地掌握这个强大的构建工具。

    composer-gradle-plugin,Gradle任务类型和与之交互的插件.zip

    本文将深入探讨一个特定的开源项目——`composer-gradle-plugin`,它是如何整合Gradle任务类型和插件,以便在Gradle环境中执行`gojuno/composer`的。 `composer-gradle-plugin`是一个针对PHP项目而设计的Gradle插件...

    gradle-6.5.7z

    Gradle采用了领域特定语言(DSL)——Groovy或Kotlin,使得构建脚本编写更加灵活和易读。Gradle-6.5是该工具的一个稳定版本,包含了多项优化和改进。 **1. Gradle 构建系统的核心概念** - **项目(Project)**: 在...

    gradle-2.8

    首先,让我们关注Gradle的核心概念——构建脚本。Gradle使用基于Groovy或Kotlin的声明式语言编写构建脚本,使得配置项目结构、依赖管理、构建任务等变得直观而灵活。在`gradle-2.8`中,你可以找到这些脚本,了解如何...

    解决duplicate_file的自定义脚本react_gradle

    本文将详细介绍如何通过一个名为`react_gradle`的自定义脚本来解决`duplicate_file`问题,并讨论与之相关的`jenkins`自动化构建。 首先,我们来看标题中的`react_gradle`,这是针对React Native项目的特定Gradle...

    gradle-3.4-bin.zip

    Gradle采用领域特定语言(DSL)——主要是Groovy和Kotlin DSL,使得构建脚本更加灵活且易于理解。`gradle-3.4-bin.zip`是Gradle 3.4版本的二进制发行版,它包含了运行Gradle所需的所有核心库和可执行文件。 **1. ...

    Android 之Gradle教程代码

    在Android开发领域,Gradle是主流的构建...通过本教程代码,你可以学习到如何配置和使用Gradle来构建Android项目,掌握依赖管理、构建变体、自定义任务等关键技能。实践操作将有助于加深对Gradle的理解,提升开发效率。

    gradle用户手册中文版

    **Gradle**是一种基于Java的构建工具,它采用了一种灵活的DSL(领域特定语言)——Groovy,来定义项目构建逻辑。Gradle旨在提高构建过程的效率与灵活性,并支持多样的构建场景。 #### 二、Gradle的特点 1. **强大...

    gradle-2.10.zip

    - **构建脚本**:使用Groovy或Kotlin编写的Gradle脚本定义了构建过程,包括任务(Task)、依赖管理和项目配置。 - **项目和模块**:Gradle支持多项目构建,一个项目可以包含多个子项目或模块,每个项目都有自己的...

    gradle-core-2.2.0.jar

    在Android开发领域,Gradle是一个不可或缺的构建工具,而`gradle-core-2.2.0.jar`则是这个强大工具的核心组件之一。本文将深入探讨Gradle 2.2.0版本的核心特性,以及它在Android Studio项目中的作用。 Gradle是一个...

    base-gradle_2.3.0-build-system:android gradle插件源代码-Android system source code

    《Android Gradle插件源代码解析——深入了解Android构建系统》 Android Gradle插件是Android开发中的重要组成部分,它使得Android应用的构建过程自动化、高效化。本文将深入探讨base-gradle_2.3.0-build-system源...

    jinkubator-gradle-presentation-tutorial

    Gradle Jinkubator 演示文稿 ...5_custom_task_types -- 创建自定义任务类型 6_simple_build_file——插件、项目配置、java任务配置、存储库。 7_build_cycle -- 在初始化阶段后修改所有任务以测量运行时间

    Java使用自动化部署工具Gradle中的任务设定教程

    Java开发中,自动化部署工具Gradle的使用是提高效率的关键之一。Gradle以其灵活性和强大的构建能力深受开发者喜爱。它采用Groovy语言编写,Groovy是一种JVM上的动态语言,语法简洁,与Java类似但更宽松,支持函数式...

    gradle-by-example

    《以示例方式进行Gradle——深入理解Kotlin构建工具》 在现代软件开发中,构建工具扮演着至关重要的角色,它们负责自动化项目的构建、编译、测试和打包过程。Gradle,作为一款强大的构建工具,以其灵活性和可扩展性...

    ker-gradle

    例如,开发者可能会使用`implementation`或`testImplementation`来声明项目依赖,使用`apply plugin:`来添加Gradle插件,使用`task`定义自定义任务。 总的来说,"ker-gradle"是一个针对Java开发的Gradle定制解决...

    SolidWithGradle:使用Gradle进行固体训练

    4. **自定义任务**:除了内置的任务外,Gradle允许创建自定义任务来执行特定的操作。例如,创建一个打印消息的任务: ```groovy task customTask { doLast { println 'Custom Task executed!' } } ``` 5. *...

    client-dependencies-gradle:从NPM,Bower或Git安装客户端依赖项

    《客户端依赖管理——使用Gradle整合NPM、Bower与Git》 在现代Web开发中,客户端依赖管理是至关重要的,它确保了项目所依赖的各种库和框架能够正确且高效地安装和更新。本文将深入探讨如何利用Gradle构建工具,结合...

    activiti6.0工作流配置(中文)

    2. BPMN 2.0标准:Activiti基于BPMN 2.0标准,学习BPMN图形符号和活动类型,如用户任务、服务任务、并发分支、事件等,是理解工作流设计的基础。 3. 工作流模型设计:学习使用 Activiti Designer 或 Eclipse 插件...

    Spark-2.4.5官网下载源码包

    1. DAG(有向无环图)调度:Spark的工作方式基于DAG,它将任务分解为小的可执行单元——Task,然后进行调度和执行。 2. Resilient Distributed Datasets (RDDs):Spark的基础数据抽象,是不可变的、分区的元素集合,...

    ant

    《Ant——Java构建工具详解》 Ant,全称为Apache Ant,是Apache软件基金会下的一个项目,主要用于Java应用程序的构建过程。它是一个基于XML的构建工具,允许开发者通过编写XML配置文件来定义构建任务,实现自动化...

Global site tag (gtag.js) - Google Analytics