前言
Gradle既然作为替代Maven的工具,自然有相对于Maven的优点。相信Gradle的灵活性是它相对Maven的一个很大的优点。然而Gradle之所以灵活,是因为它可以很方便的用Groovy实现自己的逻辑。本篇文章简单的说一说Gradle如何借助Groovy实现一些简单的自定义逻辑。
【同时也更新到了头条上https://www.toutiao.com/i6642260062624547335/】
Groovy重点
要想要一篇文章介绍完Groovy不现实,我也没有这个水平,毕竟这是一门语言,要掌握的内容不会比任何一门语言少,这里只是重点介绍一些语法或概念,能够简单的编写逻辑即可。
语法
- 兼容java语法,所以你可以完全用java语法进行编写
- 支持动态类型,和js一样,可以不用申明变量的类型,可以给变量赋值为任何类型的值
- 函数式编程,和js一样,函数也是对象,可以赋值给变量,可以作为参数传递,同样也有闭包,但是这个闭包和js的不一样,这个就不在这里讨论了
- 闭包,语法为
1
2{ [closureParameters -> ] statements }
可以看到如果没有参数则可以省略
- 常用的语法糖:函数调用可以不加括号,$表达式表示求值,比如:
1
2println "${test}"
函数最后一个参数是闭包,也可以不加圆括号,比如:
1
2
3
4
5def list = [1,2,3,4,5,6] list.each{ println it }
- 静态方法的第一个参数不需要传递
- 常用数据结构:list = [1,2,3,4,5,6] map = [‘key1’:‘value1’,‘key2’:‘value2’]
- <<相当于doLast方法的简写
- leftShift方法相当于定义doLast方法
Gradle简介
Project
Project对象和build.gradle是一对一关系,对应一个Project对象。build.gradle中的所有配置对应Project对象的一个方法或者一个变量,比如:
1
2
3
4dependencies { compile("org.springframework.boot:spring-boot-starter") }
对应的Project对象的方法
1
2void dependencies(Closure configureClosure)
Task
Task是Project对象的task方法,需要一个闭包作为参数
1
2
3
4task hello << { println 'Hello world!' }
相当于
1
2
3
4
5
6task hello { doLast{ println 'Hello world!' } }
相当于
1
2
3
4task("hello").leftShift({ println "Hello world!" })
Plugin
Plugin可以把复用的逻辑进行封装,打包。引用方式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16buildscript { ext { springBootVersion = '1.5.10.RELEASE' mavenUrl = 'http://ip:8081/repository/maven-public/' } repositories { maven { url "${mavenUrl}" } } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'io.spring.dependency-management'
除了Plugin之外,还有一个办法复用逻辑,那就是apply from 脚本。该方法引入的脚本文件可以是远程服务器的文件。
需要注意的是buildscript与外部的代码是异步执行的,比如apply from
脚本语句在buildscript之外的话,他们执行的顺序是不定的。如果需要apply
from的脚本在buildscript之内的特定位置执行,必须将apply from 脚本语句放在buildscript之内
示例一
通过gitlab api获取最后打了tag的版本号
创建一个version.gradle文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17ext.utils = [ getVersion:{ def connection = new URL("http://ip:82/api/v4/projects/163/repository/tags").openConnection() as HttpURLConnection //必须是GET方法 connection.setRequestMethod("GET") connection.setRequestProperty('User-Agent', 'groovy-'.concat(GroovySystem.getVersion())) connection.setRequestProperty('Accept', 'application/json') //必须设置PRIVATE-TOKEN,不然返回404状态 connection.setRequestProperty('PRIVATE-TOKEN', 'token') def response = connection.inputStream.text //json处理略 //appVersion为build.gradle中ext申明的变量,version为json处理后获得的版本号 appVersion = version; } ] utils.getVersion()
build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18buildscript { ext { springBootVersion = '1.5.10.RELEASE' appVersion = '' mavenUrl = 'http://ip:8081/repository/maven-public/' } // 保证utils.gradle脚本在buildscript中的其他函数前执行 apply from: 'version.gradle' repositories { maven { url "${mavenUrl}" } } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath("io.spring.gradle:dependency-management-plugin:1.0.1.RELEASE") } }
示例二
实现自定义逻辑,如果配置的版本号为数字.数字.x,根据版本号前两位数获取最新的版本。如果版本号是其他形式则不处理,比如数字.数字.数字-snapshot
创建一个version.gradle文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21ext.validVersion = [ '1.0.x':'1.0.0', '1.1.x':'1.1.3', '1.2.x':'1.2.2', '1.3.x':'1.3.1' ] ext.utils = [ getAppVersionIfNecessary:{ def versionPattern = /d+.d+.x/ //appVersion为build.gradle中ext申明的变量 def valid = appVersion =~ versionPattern if(valid) { def version = validVersion [appVersion ] println "the appVersion is auto match to ".concat(version) appVersion = version } } ] utils.getAppVersionIfNecessary()
build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18buildscript { ext { springBootVersion = '1.5.10.RELEASE' appVersion = '1.3.x' mavenUrl = 'http://ip:8081/repository/maven-public/' } // 保证utils.gradle脚本在buildscript中的其他函数前执行 apply from: 'http://ip/version.gradle' repositories { maven { url "${mavenUrl}" } } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath("io.spring.gradle:dependency-management-plugin:1.0.1.RELEASE") } }
最后
以上就是着急白开水最近收集整理的关于Gradle非常灵活——借助Groovy实现自定义逻辑或者调用Gitlab api的全部内容,更多相关Gradle非常灵活——借助Groovy实现自定义逻辑或者调用Gitlab内容请搜索靠谱客的其他文章。
发表评论 取消回复