Gradle系列之Gradle插件
前面几篇文章学习了 Gradle 基础知识、Groovy 以及 Gradle 任务,可以先阅读前面几篇文章了解 Gradle 相关知识:
本篇文章主要介绍 Gradle 插件,Gradle 内置了很多常用的插件,Gradle 中的插件可在一定的场景中可以帮助我们提高开发效率,可以通过扩展现有的插件来实现更多功能,比如 Android Gradle 插件就是基于内置的 Java 插件来实现的。
插件的作用先来一下 Gradle 插件的作用,主要有以下几个方面:
如何应用一个插件在使用一个插件之前要先使用 Project 的 apply 方法来应用该插件,插件分为二进制插件和脚本插件。 二进制插件的使用二进制插件就是实现了 org.gradle.api.Plugin 接口的插件,每个 Java Gradle 插件都有一个 plugin id,可以通过如下方式使用一个 Java 插件:
通过上述代码就将 Java 插件应用到我们的项目中了,其中 java 是 Java 插件的 plugin id,对于 Gradle 自带的核心插件都有唯一的 plugin id,这里的 java 对应的具体类型是 org.gradle.api.plugins.JavaPlugin,所以可以使用如下方式使用 Java 插件:
二进制插件一般是打包在一个 Jar 中发布的,如自定义插件的时候在发布的时候要指定插件的 Plugin id,这个 plugin id 必须是唯一的,可使用应用包名来保证 plugin id 的唯一性。 脚本插件的使用脚本插件的使用实际上就是某个脚本文件的使用,使用脚本插件时将脚本加载进来就可以了,使用脚本插件要使用到关键字 from,后面的脚本文件可以是本地的也可以是网络上的脚本文件,下面定义一段脚本,我们在 build.gradle 文件中使用它,具体如下:
下面将将在构建文件中使用这个脚本文件,具体如下:
上述代码的执行结果如下:
显然,通过 apply from 引用到插件脚本了,脚本插件的使用可将构建使用的脚本文件分段整理,可将脚本文件分离成职责分明的单个脚本文件,然后直接使用 apply from 关键字来使用这些脚本文件,如可将某些工具性质的方法以及各个依赖使用的版本号分别定义到单个 gradle 文件中,方便统一调用和管理各个依赖的版本号等。 apply方法的用法Project.apply() 可以接收三种不同的参数,具体如下:
使用上面三种方式可以配置一个插件,三种方式的写法如下:
使用第三方发布的插件大多时候需要第三方的插件来构建项目,使用的时候必须要在 buildscript{} 里配置 classpath 才能使用,如 Android Gradle 插件使用的时候就需要在 buildgradle{} 里面配置对应的 classpath,代码参考如下:
buildscript{} 块主要是在项目构建之前配置好项目构建的相关依赖,配置好这些依赖就可以通过如下方式使用插件了:
使用plugins DSL应用插件plugins DSL 是一种新的插件的应用方式,这种方式只能在 Gradle 2.1 以上才可以使用,使用方式参考如下:
关于插件的使用就到此为止。 自定义插件大多时候需要自定义插件来完成一些项目的构建操作,自定义插件必须实现 Plugin 接口,接口中的 apply 方法会在插件被应用的时候执行,可实现该方法在里面进行相关操作,下面使用 Android Studio 来进行一个简单插件的开发,插件的作用创建一个任务,这里主要借助 Android Studio 来创建一个 Groovy 工程,然后进行相关代码的开发。 在 Android Studio 中创建一个 Module,删除出 src/main、build.gradle 以外的其他文件,然后创建一个 .groovy 文件实现 Plugin 接口,文件内容如下:
然后,指定该插件的 plugin id,在 src/main 下面创建 resources/META-INF/gradle-plugins 目录,然后创建一个带有 plugin id 的 properties 文件,文件内容如下:
下面是 build.gradle 文件对应的配置参考如下:
可以说一个简单的插件就定义好了,为了方便实用将该插件项目生成 jar 包,然后就可以在其他项目中使用了,下面来一张自定义插件项目目录截图: 最后,在构建项目中使用该插件,复制插件到某个项目中,如复制到项目中的 libs 文件夹中,指定插件的 classpath ,使用 apply 方法使用插件即可:
上述代码的执行结果如下:
因为插件创建了任务 taskPlugin,所以可以使用该任务,插件的基本使用如上所述,接下来将会继续学习 Java Gradle 插件的使用。可以关注公众号:jzman-blog,一起交流学习。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |