Gradle笔记 八 Gradle 插件(一)https://developer.aliyun.com/article/1391976
4.然后实现插件代码Text.groovy,注意文件后缀为groovy,文件要引入package com.onenewcode
package org.onenewcode import org.gradle.api.Plugin import org.gradle.api.Project class Text implements Plugin<Project>{ @Override void apply(Project project) { project.task("onenewcode"){ doLast{ println("自定义onenewcode插件") } } } }
- 接下来在 main 目录下创建 resources 目录,在 resources 目录下创建 META-INF 目录,在 META-INF 目录下创建
gradle-plugins 目录,在gradle-plugins 目录下创建properties 文件 - properties 文件可以自己命名,但是要以.properties 结尾,比如 com.onenewcode.plugin.properties,其 com.onenewcode.plugin 就是定义的包名路径.
- 最后需要在properties 文件中指明我们实现插件的全类名
implementation-class=org.onenewcode.Text
到目前为止我们的插件项目已经写完了,在 module 引入我们写的插件apply plugin:'org.onenewcode.plugin'
,然后执行插件的Task,./gradle onenewcode
正常输出则证明创建成功
这种形式的写法,在我们整个工程的module 都可以使用,但也只是限制在本工程,其他工程不能使用。
第二种写插件的方式他只能在本工程中使用,而其他的项目工程不能使用,有时候我们需要一个插件在多个工程中使用, 这时候我们就需要把插件上传maven 中。
第一步: 首先将上述buildSrc 目录复制一份,修改文件夹名,然后在settings.gradle 文件中使用include 引入第二步:修改build.gradle 文件,发布到maven 仓库中
applyplugin: 'groovy' //必须 applyplugin: 'maven-publish' dependencies{ implementationgradleApi()//必须 implementationlocalGroovy()//必须 } repositories{ google() jcenter() mavenCentral()//必须 } sourceSets{//把项目入口设置为src/main/groovy main{ groovy{ srcDir'src/main/groovy' } } } publishing{ publications{ myLibrary(MavenPublication){ groupId='com.onenewcode.plugin'//指定GAV坐标信息 artifactId='library' version='1.1' fromcomponents.java//发布jar包 //fromcomponents.web///引入war插件,发布war包 } } repositories{ maven{url"$rootDir/lib/release"} //发布项目到私服中 // maven{ // name='myRepo'//name属性可选,表示仓库名称,url必填 // //发布地址:可以是本地仓库或者maven私服 // //url=layout.buildDirectory.dir("repo") // //url='http://my.org/repo' // //changeURLstopointtoyourrepos,e.g.http://my.org/repo // //认证信息:用户名和密码 // credentials{ // username='joe' // password='secret' // } // } } }
第三步:执行publish 指令,发布到根 project 或者maven 私服仓库。
第四步:使用插件,在项目级 build.gradle 文件中将插件添加到 classpath:
buildscript { repositories { maven { url "$rootDir/lib/release" } } dependencies { classpath "com.onenewcode.plugin:library:1.1" } } apply plugin: 'java' //是在 onenewcodeplugin 中定义的插件 ID apply plugin: 'com.onenewcode.plugin'
第五步:执行 gradle build 指令就会在控制台看到自定义插件的输出,说明自定义插件就已经生效了。
插件的关注点
第一点: 插件的引用
apply plugin: ‘插件名’
第二点:主要的功能[任务]
当我们在工程中引入插件后,插件会自动的为我们的工程添加一些额外的任务来完成相应的功能。以Java 插件为例,当我们加入java 插件之后,就加入了如下功能:
第三点:工程目录结构
一些插件对工程目结构有约定,所以我们一般遵循它的约定结构来创建工程,这也是 Gradle 的“约定优于配置”原则。例如java 插件规定的项目源集目录结构如下所示:
如果要使用某个插件就应该按照它约定的目录结构设置,这样能大大提高我们的效率,当然各目录结构也可以自己定义。
第四点:依赖管理
比如前面我们提到的 依赖的类型[依赖管理]部分,不同的插件提供了不同的依赖管理。
第五点:常用的属性
例如:Java 插件会为工程添加一些常用的属性,我们可以直接在编译脚本中直接使用。
属性名称 | 类型 | 默认值 | 描述 |
reportsDirName | String | reports 生成报告的目录名称 | |
reportsDir | File(只读) | buildDir/reportsDirName | 生成报告的目录 |
testResultsDirName | String | test-results | 生成测试result.xml 文件的目录名称 |
testResultsDir | File(只读) | reportsDir/testReportDirName | 生成测试报告的目录 |
libsDirName | String | libs | 生成lib 库的目录名称 |
libsDir | File(只读) | buildDir/libsDirName | 生成lib 库的目录 |
distsDirName | String | distributions | 生成发布文件的目录名称 |
distsDir | File(只读) | buildDir/distsDirName | 生成发布文件的目录 |
docsDir | File(只读) | buildDir/docsDirName | 生成帮助文档的目录 |
dependencyCacheDirName | String | dependency-cache | 存储缓存资源依赖信息的目录名称 |
dependencyCacheDir | File(只读) | buildDir/dependencyCacheDirName | 存储缓存资源依赖信息的目录 |
当然,这里还有一些其它属性
属性名称 | 类型 | 默认值 | 描述 |
sourceSets | SourceSetContainer(只读) | Notnull | 包含工程的资源集合(source sets.) |
sourceCompatibility | JavaVersion,也可以使用字符串或数字 | 根据使用的JVM定 | 编译java文件时指定使用的java版本 |
targetCompatibility | JavaVersion,也可以使用字符串或数字, | sourceCompatibility | 生成classes的java版本 |
archivesBaseName | String | projectName | 作为归档文件的默认名称,如JAR或者ZIP文件的名称 |
Java 插件分析
参考官网:https://docs.gradle.org/current/userguide/plugin_reference.html,以Java插件为例,讲解需要关注的几点:
第一点:我们要关注插件使用
plugins { id 'java' }
第二点:我们要关注插件的功能
我们可通过官方文档介绍了解某个插件功能或者百度、再或者大家可以通过 gradle tasks 查看加入java 插件前后的区别。
第三点:项目布局
一般加入一个插件之后,插件也会提供相应的目录结构,例如:java 插件的目录结构
当然这个默认的目录结构也是可以改动的例如:
sourceSets { main { java { srcDirs = ['src/java'] } resources { srcDirs = ['src/resources'] } } }
也可设置源集的属性等信息。
第四点:依赖管理:以java 插件为例,提供了很多依赖管理项
源集依赖关系配置