Gradle ExtenionContainer 创建和使用扩展参数(extensions)详解
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)详解相关推荐
- 线程池的创建及参数设置详解
一. 常见线程池 线程池的创建方法主要有两类,第一是通过Executors 创建线程池,第二是通过 ThreadPoolExecutor 创建线程池. 首先我们来看通过Executors 创建的线程池 ...
- 【深入理解Hadoop原理】Hadoop 参数配置 详解
Hadoop 参数配置 详解 一.常用端口 组件 节点 默认端口 配置 用途说明 HDFS DataNode 50010 dfs.datanode.address datanode服务端口,用于数据传 ...
- PHP扩展代码结构详解
PHP扩展代码结构详解 : 这个是继: 使用ext_skel和phpize构建php5扩展 内容 (拆分出来) Zend_API:深入_PHP_内核:http://cn2.php.net/manua ...
- python process 函数_Python Process创建进程的2种方法详解
前面介绍了使用 os.fork() 函数实现多进程编程,该方法最明显的缺陷就是不适用于 Windows 系统.本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法. Pytho ...
- oracle数据库pfile文件,Oracle pfile/spfile参数文件详解
Oracle pfile/spfile参数文件详解 在创建数据库时,SPFile文件中部分必须考虑的参数值: 基本规则 a.在SPFile文件中,所有参数都是可选的,也就是说只需要在初始化参数文件中列 ...
- Oracle创建表语句(Create table)语法详解及示例
Oracle创建表语句(Create table)语法详解及示例 创建表(Create table)语法详解 1. ORACLE常用的字段类型ORACLE常用的字段类型有 VARCHAR2 (si ...
- JVM调优系列--Java命令选项(参数)--大全/详解/常用
原文网址:JVM调优系列--Java命令选项(参数)--大全/详解/常用_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java的java命令用法,包括:常用用法.选项大全. J ...
- python中什么是可变参数_详解Python的三种可变参数
详解Python的三种可变参数 可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中, ...
- Python必备基本技能——命令行参数args详解
Python必备基本技能--命令行参数args详解 1. 效果图 2. 源码 2.1 简单命令行参数 2.1 轮廓检测源代码 参考 这篇博客将介绍一项开发人员.工程师和计算机科学家必备的技能--命令行 ...
最新文章
- 连续三天说一个事情 : 信号转换
- [笔记]何为Linux及其文件系统(四)
- 菜鸟玩基金(四)——注意事项
- 还在为系统迁移烦恼?掌握这些“基本法”解锁更多可能
- 一个内核网络漏洞详解|容器逃逸
- linux怎么切换为oracle用户权限,linux肿么给oracle中用户权限
- 如何使用Kubernetes里的NetworkPolicy
- java heap_javaHeap的组成及GC监控
- linux实现自动远程备份(scp+ssh)
- C3P0连接池问题,APPARENT DEADLOCK!!! Creating emergency..... [问题点数:20分,结帖人lovekong]...
- nginx 的启动、停止与重启
- Excel 从web中提取数据
- 关于Java栈与堆的思考 (zz matrix )
- adb安装apk python小工具
- 小米4 miui6 android,小米4如何线刷MIUI6 小米4线刷MIUI6教程【图文步骤】
- 华为管理学案例分析_华为管理成功案例分析答案
- 【典型液压系统】组合机床动力滑台液压系统
- linux 内核网络中 RPS/RFS 原理Ⅱ
- 什么是阻塞、非阻塞、同步和异步以及IO模型
- 清华大学计算机系人才流失,大量中国人才流失,科研被国外扼住喉咙,清华等8所高校忍不住了...