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> {
  @Override
  void 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> {
  @Override
  void 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 性能优化》

猜你喜欢

转载自blog.csdn.net/u011578734/article/details/114104568