概述
前言
Gradle既然作为替代Maven的工具,自然有相对于Maven的优点。相信Gradle的灵活性是它相对Maven的一个很大的优点。然而Gradle之所以灵活,是因为它可以很方便的用Groovy实现自己的逻辑。本篇文章简单的说一说Gradle如何借助Groovy实现一些简单的自定义逻辑。
【同时也更新到了头条上https://www.toutiao.com/i6642260062624547335/】
Groovy重点
要想要一篇文章介绍完Groovy不现实,我也没有这个水平,毕竟这是一门语言,要掌握的内容不会比任何一门语言少,这里只是重点介绍一些语法或概念,能够简单的编写逻辑即可。
语法
- 兼容java语法,所以你可以完全用java语法进行编写
- 支持动态类型,和js一样,可以不用申明变量的类型,可以给变量赋值为任何类型的值
- 函数式编程,和js一样,函数也是对象,可以赋值给变量,可以作为参数传递,同样也有闭包,但是这个闭包和js的不一样,这个就不在这里讨论了
- 闭包,语法为
{ [closureParameters -> ] statements }
可以看到如果没有参数则可以省略
- 常用的语法糖:函数调用可以不加括号,$表达式表示求值,比如:
println "${test}"
函数最后一个参数是闭包,也可以不加圆括号,比如:
def 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对象的一个方法或者一个变量,比如:
dependencies {
compile("org.springframework.boot:spring-boot-starter")
}
对应的Project对象的方法
void dependencies(Closure configureClosure)
Task
Task是Project对象的task方法,需要一个闭包作为参数
task hello << {
println 'Hello world!'
}
相当于
task hello {
doLast{
println 'Hello world!'
}
}
相当于
task("hello").leftShift({
println "Hello world!"
})
Plugin
Plugin可以把复用的逻辑进行封装,打包。引用方式如下:
buildscript {
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文件
ext.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
buildscript {
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文件
ext.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
buildscript {
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 api所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复