Gradle ExtenionContainer 创建和使用扩展参数(extensions)详解


我们在开发 Gradle 插件时,大多数插件都需要从构建脚本中获取一些配置,这样就可以根据项目的不同,对 Gradle 插件传递不同的配置,而不需要修改插件内的代码。我们可以使用 ExtensionContainer 来实现 Gradle 的扩展(参数传递能力)。

ExtenionContainer

每个 Gradle 的 Project 都维护了一个 ExtenionContainer,我们可以通过 project.extensions 进行访问,通过它,我们可以实现属性的定义,以及属性的获取。

通过 Project 的以下 API 可以获取到 ExtensionContainer 对象:

ExtensionContainer getExtensions()

ExtensionContainer 主要 API 功能及用法

ExtensionContainer 可以通过它的 create 方法来创建 Extension(也就是扩展属性)。

create 的方法定义如下:

<T> T create(String name, Class<T> type, Object... constructionArguments)
<T> T create(Class<T> publicType, String name, Class<? extends T> instanceType, Object... constructionArguments)
  • publicType:创建的 Extension 实例暴露出来的类类型;
  • name:要创建的 Extension 的名字,可以是任意符合命名规则的字符串,不能与已有的重复,否则会抛异常;
  • instanceType:该 Extension 的类类型;
  • constructionArguments:类的构造函数参数值

实例

接下来,我们来实现一个简单的参数传递示例。

1. 在插件中,定义参数及对应关系

首先,我们定义一个 Gradle 插件 DemoPlugin,并使用 extensions(也可以使用 getExtensions()) 来定义一个扩展属性(扩展对象):

class DemoPlugin implements Plugin<Project> {@Overridevoid apply(Project project) {//定义 extConfig 属性,并且与 ExtConfig 进行绑定。project.extensions.create('extConfig', ExtConfig)project.tasks.create('printExtConfig') << {//通过 extConfig 属性,获取外部传递进来的 message 的具体内容。println("DemoPlugin message =" + project.extConfig.message)}}
}
class ExtConfig {String message
}

示例中,ExtConfig 是一个 Groovy 类,它有一个 message 的属性。使用 extensions 在 Project 中添加一个 extConfig 扩展就相当于给 Project 配置了一个 extConfig 属性。

ExtConfig 就是扩展模型,我们给它加了一个 message 属性。并且在 DemoPlugin 的 apply 中将 ExtConfig 与关键字 ‘extConfig’ 进行了绑定。最后创建了一个 ‘printExtConfig’ 的 Task 进行 log 输出。

那么,参数传递的机制是什么呢?

由于 Project 类实现了 ExtensionAware 接口,是属于可扩展的。ExtensionAware 对象有一个方法 getExtensions(),该方法返回一个 ExtensionContainer 对象,ExtensionContainer 对象可以通过 create() 方法来注册我们的扩展。于是,这里就可以把 extConfig 这个闭包和 ExternalConfig 这个类关联起来,这就是插件的扩展机制。

2. 使用该参数

我们已经定义好了扩展参数了,接下来,我们只需要在使用该 Gradle 插件的地方使用该参数,设置个性的参数内容即可。

apply plugin: DemoPlugin// 配置扩展
extConfig {message = 'hello world!'
}

创建嵌套扩展参数

本例是带有嵌套对象的扩展参数:

class DemoPlugin implements Plugin<Project> {@Overridevoid apply(Project project) {//定义 extConfig 属性,并且与 ExtConfig 进行绑定。project.extensions.create('extConfig', ExtConfig)project.extConfig.extensions.create('nestExt', PluginNestExtension)project.tasks.create('printExtConfig') << {//通过 extConfig 属性,获取外部传递进来的 message 的具体内容。println("DemoPlugin message =" + project.extConfig.message)println("DemoPlugin nestExt.nestParam1 =" + project.pluginExt.nestExt.nestParam1)}}
}
class ExtConfig {String message
}
class PluginNestExtension {def nestParam1='this is nestParam1'def nestParam2='this is nestParam2'
}

**PS:更多性能优化相关文章,请查看 --> 《Android 性能优化》
**PS:更多性能优化相关文章,请查看 --> 《Android 性能优化》
**PS:更多性能优化相关文章,请查看 --> 《Android 性能优化》

Gradle ExtenionContainer 创建和使用扩展参数(extensions)详解相关推荐

  1. 线程池的创建及参数设置详解

    一. 常见线程池 线程池的创建方法主要有两类,第一是通过Executors 创建线程池,第二是通过 ThreadPoolExecutor 创建线程池. 首先我们来看通过Executors 创建的线程池 ...

  2. 【深入理解Hadoop原理】Hadoop 参数配置 详解

    Hadoop 参数配置 详解 一.常用端口 组件 节点 默认端口 配置 用途说明 HDFS DataNode 50010 dfs.datanode.address datanode服务端口,用于数据传 ...

  3. PHP扩展代码结构详解

    PHP扩展代码结构详解 : 这个是继: 使用ext_skel和phpize构建php5扩展  内容 (拆分出来) Zend_API:深入_PHP_内核:http://cn2.php.net/manua ...

  4. python process 函数_Python Process创建进程的2种方法详解

    前面介绍了使用 os.fork() 函数实现多进程编程,该方法最明显的缺陷就是不适用于 Windows 系统.本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法. Pytho ...

  5. oracle数据库pfile文件,Oracle pfile/spfile参数文件详解

    Oracle pfile/spfile参数文件详解 在创建数据库时,SPFile文件中部分必须考虑的参数值: 基本规则 a.在SPFile文件中,所有参数都是可选的,也就是说只需要在初始化参数文件中列 ...

  6. Oracle创建表语句(Create table)语法详解及示例

    Oracle创建表语句(Create table)语法详解及示例   创建表(Create table)语法详解 1. ORACLE常用的字段类型ORACLE常用的字段类型有 VARCHAR2 (si ...

  7. JVM调优系列--Java命令选项(参数)--大全/详解/常用

    原文网址:JVM调优系列--Java命令选项(参数)--大全/详解/常用_IT利刃出鞘的博客-CSDN博客 简介 说明        本文介绍Java的java命令用法,包括:常用用法.选项大全. J ...

  8. python中什么是可变参数_详解Python的三种可变参数

    详解Python的三种可变参数 可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中, ...

  9. Python必备基本技能——命令行参数args详解

    Python必备基本技能--命令行参数args详解 1. 效果图 2. 源码 2.1 简单命令行参数 2.1 轮廓检测源代码 参考 这篇博客将介绍一项开发人员.工程师和计算机科学家必备的技能--命令行 ...

最新文章

  1. 连续三天说一个事情 : 信号转换
  2. [笔记]何为Linux及其文件系统(四)
  3. 菜鸟玩基金(四)——注意事项
  4. 还在为系统迁移烦恼?掌握这些“基本法”解锁更多可能
  5. 一个内核网络漏洞详解|容器逃逸
  6. linux怎么切换为oracle用户权限,linux肿么给oracle中用户权限
  7. 如何使用Kubernetes里的NetworkPolicy
  8. java heap_javaHeap的组成及GC监控
  9. linux实现自动远程备份(scp+ssh)
  10. C3P0连接池问题,APPARENT DEADLOCK!!! Creating emergency..... [问题点数:20分,结帖人lovekong]...
  11. nginx 的启动、停止与重启
  12. Excel 从web中提取数据
  13. 关于Java栈与堆的思考 (zz matrix )
  14. adb安装apk python小工具
  15. 小米4 miui6 android,小米4如何线刷MIUI6 小米4线刷MIUI6教程【图文步骤】
  16. 华为管理学案例分析_华为管理成功案例分析答案
  17. 【典型液压系统】组合机床动力滑台液压系统
  18. linux 内核网络中 RPS/RFS 原理Ⅱ
  19. 什么是阻塞、非阻塞、同步和异步以及IO模型
  20. 清华大学计算机系人才流失,大量中国人才流失,科研被国外扼住喉咙,清华等8所高校忍不住了...

热门文章

  1. mac和eshow投屏链接不成功问题
  2. 【Unity3D基础2-13】Unity3D UI系统之UGUI
  3. 51单片机之智能小车(避障、跟随、循迹)
  4. vanilla js_用Vanilla js编写前端组件
  5. 今天遇到的坑--this.$emit
  6. java输入输出流、字符字节流
  7. 第1章 整数 |《初等数论及其应用》
  8. 设置顺序表L是个递增的有序表,试写一算法将number插入L中,并使L任是一个有序表。
  9. layui中的treeGrid 树形表格
  10. 苹果系10大必备应用