我是靠谱客的博主 着急白开水,最近开发中收集的这篇文章主要介绍Gradle非常灵活——借助Groovy实现自定义逻辑或者调用Gitlab api,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部