Gradle使用说明

Groovy 概述

DSL 领域特定语言

Groovy是脚本的DSL
Groovy基于JVM的开发语言
Groovy可以与Java完美结合,而且可以使用java所有类库

Groovy特性

语法上支持动态类型,闭包等新一代语言特性

Groovy优势

  1. 更加敏捷
  2. 既可以作为编程语言,也可以作为脚本语言

第一个Groovy程序

println ‘Hello Groovy’

Groovy 语法详解

基础语法

groovy中变量

  • 变量的类型
  1. 基本类型 实际上也是对象类型(基本类型会自动转换为包装类型)
double y = 3.14
println y.class //class java.lang.Double
  1. 对象类型
  • 变量的定义
  1. 强类型定义方式
  2. 弱类型def定义方式 编译器会根据后边的赋值自动分配默认类型(小数会被认为是BigDecimal)
def b = 3.14
println b.class //class java.math.BigDecimal

当变量只有自己使用可定义def,当在公共代码块中定义时,使用强类型

groovy中字符串中的详解

java :String
groovy : GString
常用的定义方式:

  1. def name = 'a single name ’ a ‘’ \是转义符 类型:String
  2. def tribleName = ‘’‘带格式的字符串 ‘’’ 类型:String
  3. def doubleName = “可扩展字符串” 类型:String
def a = "Groovy"
def sayHello = "Hello $a"
println(sayHello)
//此时sayHello的类型是GString
def sum = "The sum of 2 and 3 equals ${2 + 3}"

可扩展任意的表达式
不必纠结是String还是GString,GString可以直接转换为String(Groovy的内部实现)

新增操作符:

  • java.lang.String
  • DefaultGroovyMethods(Groovy为所有类型新增的方法)
  • StringGroovyMethods(继承于上,并做了相应的扩展)其中参数的类型有:1,普通类型的参数;2,闭包类型的参数

方法及操作符

  1. center(int i,String a);用a在字符串中进行填充,直到字符串的长度为i;
  2. center(int i);用空格进行填充
  3. padLeft(int i,String a);用a在字符串的左边进行填充,直到字符串长度为i;
  4. str1 > str2 字符串的比较,比较的各位置字符在表中的编号;返回boolean类型
  5. str[i] 返回第i位的字符
  6. str[i…j]返回从i位到j位之间字符组成的字符串
  7. minus(String s);若s是字符串中的一部分,则删掉后返回,相同的办法 str1-str2
  8. reserve();字符串反转
  9. capitalize()首字母大写
  10. isNumber()判断是否是数字
  11. toInteger()转换为Integer

逻辑控制

在Groovy中Swith…Case语句更加灵活,可以使用任意类型:

def x = 1.23
def result
switch (x) {
    case 'foo':
        result = 'found foo'
        break
    case 'bar':
        result = 'bar'
        break
    case  [4,5,6,'inlist']:
        result = 'list'
        break
    case 12..30:
        result = 'range'
        break
    case Integer:
        result = 'integer'
        break
    case  BigDecimal:
        result = 'bigdecimal'
        break
    default:
        result = 'default'
}
println result;//bigdecimal

for循环的几种变体

//对范围的循环
def sum = 0
for(i in 0..9) {
    sum += i
}
//对list的循环
sum = 0;
for(i in [1,2,3,4,5,6]){
    sum =+ i
}
//对map进行循环
for(i in ['lili':1,'luck':2]){
    sum += i.value
}

groovy闭包讲解

基础

概念

  1. 定义 及以个代码块 def clouser = {println 'Hello Groovy'}
  2. 调用
def clouser0 = {println 'Hello Groovy'}
clouser0()
clouser0.call()
def clouser = { String name -> println "Hello ${name}"}
clouser.call("groovy");
def name = 'grovvy'
clouser(name);
def clouser1 = { String name1,int age -> println "Hello ${name},My age is ${age}"}
clouser1('jiaozhenzhen',30);
//隐式参数it
def clouser2 = {println "Hello ${it}"}
clouser2("chengcheng")

参数

  • 普通参数
  • 隐式参数
    闭包返回值:总是有返回值的
def closer = {return "Hello ${it}"}
def result = closer('groovy')
println result

def closer1 = {println "Hello ${it}"}
def result1 = closer1('groovy')
println result1 //null

使用

与基本类型结合使用

//求阶乘
int fac(int number) {
    int result = 1;
    1.upto(number){
        num ->
            result *= num
    }
    return result
}
//求阶乘
int fac2(int number){
    int result = 1;
    number.downto(1,{num -> result *= num})
    return result
}
println fac2(5);
//求1-100的和
int toSum(int number) {
    int result = 0
    number.times {num -> result += num}
    return result
}
println toSum(101);

闭包怎么写要参考方法内部闭包的调用
String

def str= 'the 2 and 3 is 5'
//each遍历
str.each {
    String i -> print i.multiply(2)//每次打印两个
}//tthhee  22  aanndd  33  iiss  55
//find查找符合条件的第一个字符
def n = str.find {
    String s -> s.isNumber()
}
println n //2
//findAll
def list = str.findAll {String s -> s.isNumber()} //[2, 3, 5]
println list
//any 只要有一处满足即返回true
def r = str.any {String s -> s.isNumber()}
println r //true
//every 只有都满足情况才返回true
def everyr = str.every {String s -> s.isNumber()}
println everyr;
//collect 对每个字符进行闭包处理在进行收集
def list2 = str.collect {it.toUpperCase()}
println list2

数据结构

文件等

进阶

闭包的关键变量
this
owner
delegate

def scriptClouser = {
    println "scriptClouser this:" + this //代表闭包定义处的类的对象 GroovyScript在编译后会生成一个集成Scprit的一个类
    println "scriptClouser owner:" + owner//代表闭包定义处的类的对象或者拥有者的对象 闭包可以定义在闭包中,此时owner代表的是外层闭包
    println "scriptClouser delegate:" + delegate//代表任意对象,默认与owner一致,可以对其进行修改(this和owner是不可以修改的)
}
scriptClouser.delegate = ...

闭包的委托策略
修改委托后有时还需要修改一下委托策略

Student stu = new Student(name: "张三");
Teacher tea = new Teacher(name:  "李四")
stu.callName.delegate = tea
stu.callName.resolveStrategy = Closure.DELEGATE_FIRST
println stu.toString()

委托策略有
public static final int OWNER_FIRST = 0; //优先查找当前owner
public static final int DELEGATE_FIRST = 1;//优先查找代理对象
public static final int OWNER_ONLY = 2;
public static final int DELEGATE_ONLY = 3;
public static final int TO_SELF = 4;

groovy数据结构

grovvy 列表
列表的定义

def list = [1,2,3,4,5]
println list.class //ArrayList
def groovyArray = [1,2,3,4,5] as int[] // 定义数组
int[] array = [2,3,4] //定义数组

列表的操作

def sortList = [2,1,4,7,3,8,-9]
//sortList.sort()
//println sortList
sortList.sort {a,b -> a == b ? 0:
                    Math.abs(a) > Math.abs(b) ? 1 :-1
}
println sortList
def sortString = ['abc','z','Hello','groovy','java']
sortString.sort {return it.size()}
println sortString
def list = [2,1,4,7,3,8,-9]
//find 查找
def a = list.find{return it % 2 == 0}
//findAll
def b = list.findAll {return it % 2 == 0}
//every
def c =  list.every {return it > 0}
//any
def d = list.any{return it >0}
//min()
def e = list.min()
def f = list.min {return Math.abs(it)}
//max()
//count
def g = list.count {return it % 2 == 0 }

groovy 中映射的详解
定义
定义时,key值要定义成单引号的不可变字符串,不加单引号时,编译器会编译成不可变字符串

def colours = [red : 'ff0000',green:'ooffoo',yellow:'cc222']
//默认的定义的是LinkedHashMap

//查找
println colours['red']
//不能使用colours.class 因为不确定是key还是class
println colours.red

//添加
colours.blue = 'fffff000'//同样也是修改
println colours.toMapString()
//删除 remove
//遍历
def students = [
        1:[number:'001',
            name:'Boo',
            score:55,
            sex:'male'
        ],
        2:[number:'002',
           name:'Johnny',
           score:62,
           sex:'female'
        ],
        3:[number:'003',
           name:'Claire',
           score:73,
           sex:'female'
        ],
        4:[number:'004',
           name:'Amy',
           score:66,
           sex:'male'
        ]
]

students.each {def student ->
    println student.key
    println student.value
}
students.eachWithIndex{ def student, int index ->
    println "index is ${index},the key is ${student.key}, the value is ${student.value}"
}
students.each{key,value ->
    println "the key is ${key},the value is ${value}"
}
//查找
def entry = students.find {def student ->
    return student.value.score >= 60
}

println entry

def entrys = students.findAll {def student ->
    return student.value.score >= 60
}

def count = students.count { def student ->
    return  student.value.score >=60 &&
            student.value.sex == 'male'
}
//收集及格的姓名
def names =  students.findAll {def student ->
    return student.value.score >= 60}
    .collect {return it.value.name}
//是一个list
println names

def groups = students.groupBy {
    def student ->
        return student.value.score >= 60 ? '及格' : '不及格'
}

//排序
def sort = students.sort {
    student1, student2 ->
        Number num1 = student1.value.score
        Number num2 = student2.value.score
        return num1 == num2 ? 0 :num1 > num2 ? -1 : 1
}
//返回的是新的map


范围

def range = 1..10

def one = range[0]
boolean flag = range.contains(10)
def from = range.from //开始值
def to  = range.to //结束值
//Range 其实是List的子类
//遍历
range.each {
    println it
}
for(i in range){
    println i
}

//在Swith。。Case中的使用
println getGrade(91)
def getGrade(Number score){
    def result
    switch (score){
        case 0..<60:
            result = '不及格'
            break
        case 60..<80:
            result = '及格'
            break
        case 80..<90:
            result = '中等'
            break
        case 90..100:
            result = '优秀'
    }
    return result
}

groovy面向对象

类,接口等

//类
//所用类型默认都是public
def person = new Person(name:'zhangsan',age:26);
person.age//无论使用.property还是get方法,实际上都是调用get方法
//接口
接口中不能定义非public的方法
//trait 和接口和抽象类相似,但可以有实现的方法
trait DefaultTrait {
    abstract  void eat()//抽象方法需要使用abstract关键字
    void smile(){
        println '笑'
    }
}

元编程
MetaClass类
methodMissing方法
invokeMethod方法
当调用方法不存在是会调用定义的,invokeMethod(String methodName,Object param[])
当重写了methodMissing(String name,Object args),调用不存在时调用本方法,优先级比invokeMethod方法
MetaClass类可以为类提供默认属性,使用Person.address = '..',即动态的设置属性(默认值)
为类添加方法Person.mataClass.sexUpperCase = {-> sex.toUpperCase()}
为类添加静态方法Person.mataClass.static.name = {...-> sex.toUpperCase()}
一般情况下,通过动态添加的方法和属性不能在其他代码中使用,若想要使用可以添加代码
ExpandoMetaClass.enableGlobally()

高级语法

对json的操作

转化为json

def json = JsonOutput.toJson(...);
JsonOutput.prettyprint(json)

def jsonParse = new JsonSlurper();
jsonSlpuer.parse(obj);

对xml文件的操作

解析xml

def xmlSluper = new XmlSlurper();或者xmlParser
def response = xmlSluper.parserText(xml);
println response.value.books[0].book[0].title.text();
println response.value.books[1].book[0].@id  //@制定属性
response.value.book.each{books ->
	books.book.each{book ->
		def author = bool.author.text()
		println book.name.text()
	}
}
//深度遍历
response.depthFirst().findAll{book ->
		def author = bool.author.text()
		println book.name.text()}

广度遍历
reponse.value.books.children().findAll{}

生产xml

def sw = new StringWriter();
def xmlBuilder = new MarkupBuilder(sw);//生产xml数据的核心类
xmlBuilder.langs.(type:'current'...属性){
	language(flavor:'static',java(值))
//按对象生产xml文档
xmlBuilder.langs(type:xx){
	list.each{
	}
}

对文件的操作

文件的获取

file.eachline{line->}

file.getText()

file.readLines();生成一个字符串的集合

file.withReader{reader ->
	char[] buffer = new char[100]
	reader.read(buffer)
	return burrer
}

文件的写

file.withReader{
	writer ->{}
}
def copy(String sourcePath,String destationPath){
	try{
		def desFile = new File(destationPath)
		if(!desFile.exists){
			desFile.createNewFile();
		}
		new File(sourcePath).withReader{reader ->
			def lines = reader.readLines()
			desFile.withWiter{writer ->
				lines.each{line ->
					writer.append(line)
				}
			}
		
		}
		return true
	}catch(Exception e){
		e.printStackTrace()
	}
}

GRADLE

主要组成:groovy,build script block,gradle api

流程
initialization-> configuration ->Execution

gradle生命周期

project相关api

/*Project 相关API,在build.gradle中书写*/
//1,this.getAllprojects():获取所有project
this.getAllprojects()
//2,this.getSubprojects():获取子project
this.getSubprojects()
//3,this.getParent():获取父project
this.getParent()
//this.getRootProject():获取根project
this.getRootProject()
//对project做操作,'app'为相对路径
project('app'){
    project ->{
        apply plugin:"com.android.app"
    }
}
//对所有的工程操作(配置当前及子工程)
allprojects {

}
//获取project
project('路径')

//对子工程操作
subprojects {
    Project project ->{
        if(project.plugins.hasPlugin('com.android.library')){
            apply from: "../pulishToMaven.gradle"
        }
    }
}

task相关api

projects是一个task,可通过gradle projects

属性相关api

//定义属性
def ver= '0.0.1'
version = ver

//扩展属性
//扩展代码块
ext{
	compileSdkVersion = 25
} 
android{
	compileSdkVersion this.compileSdkVersion
}

//ext{}
subprojects{
	ext{
		compileSdkVersion = 25
		libAndroidDesign = 'com.android.support:design:25.0.0'
	}
}

//ext定义在RootProject中
子工程中使用this.rootProject.属性,或this.属性(根工程的属性会被子工程继承)

//最佳:在外部定义*.gradle,在内部定义ext{}
apply from: this.file('commom.gradle')
//扩展属性的其他定义方式
//定义在gradle.properties中
if(hasProperty('isLoadTest') ? isLoadTest.toBoolean() : false){
	include ':Test'
}

file相关api

路径获取相关API

//1 getRootDir() 获取根目录
println "the root file path is:" + getRootDir().absolutePath
//2 getBuildDir() 当前工程的的build文件夹
println "the build file path is :" +getBuildDir().absolutePath
//3 getProjectDir() 当前工程的文件夹
println "the project file path is :" +getProjectDir().absolutePath

文件操作相关API

//文件定位  相对路径相对于当前工程
file('path') //文件定位
files(String...path)//多文件定位
copy{//文件拷贝
	from file('')
	into getRootProject().getBuildDir().path + "/apk"
	exclude{}
	rename{}
}
//对文件树进行遍历
fileTree("/build/outputs/apk/"){
	FileTree fileTree ->
	fileTree.visit{
		FileTreeElement element ->
		println element.file.name
	}
}

其他api

依赖相关api

dependencies{
	compile fileTree(include:['*.jar'],dir:'libs')//本地的lib文件
	compile com.... 引用第三发jar{
		exclude module: 'support-4'或
		exclude group:'com.android.support'//排除依赖
		transive false  //禁止传递依赖,一般情况下不要使用传递依赖
	}
	compile project('path') 引用工程
}
buildscript{
	ScriptHandler scriptHandler ->
	//工程的仓库地址
	repositories{RepositoryHandler handler ->
		mavenCentral()
		mavenLocal()
		maven{
			name 'personal'
			url 'http...'
			credentials{
				username = 'amdin'
				password = 'admin123'
	
			}
		}
		

	}
	//grade对插件的依赖,而不是应用程序
	dependencied{}

}

外部命令执行

task('apkcopy'){

	doLast{
		def sourcePath = ''
		def desationPath = ''
		def command = "mv -f ${sourcePath} ${desationPath}"
		exec{
			try{
				executable 'bash'
				args '-c' ,command //唯一会变的是command
				println 'exec is success'
			}catch(GradleException e){
				print 'the command is excute failded '
			}
		}
		}
	}
}

Task

Task定义及配置

定义

task helloTask{
	print 'i am helloTask'
}
this.tasks.create(name:'helloTask2'){//用taskContainer管理task
	println 'i am helloTask2'
}

配置

task helloTask(group:'imooc',description:'task Study'){}//在定义的时候配置,推荐
this.tasks.create(name:'helloTask2'){//用taskContainer管理task
	setGroup('imooc')
	setDescription('task Study2')
	println 'i am helloTask2'//在配置阶段执行
}

Task的执行详解

task helloTask(group:'imooc',description:'task Study'){
	doFirst{
	
	}//在执行阶段执行
	doLast{
	
	}//在执行阶段执行
	
}
helloTask.doFirst{}
//外部的先执行,闭包内部的后执行
def startBuildTime,endBuildTime
this.afterEvaluate{ Project project //配置后,保证task已经配置完成
	def preBuildTask = project.tasks.getByName('preBuild')
	preBuildTask.doFirst{
		startBuildTime = System.currentTimeMillis();
	}
	def buildTask = project.tasks.getByName('build')
	buildTask.doLast{
		endBuildTime = System.currentTimeMillis();
		println "the build thim is ${endBuildTime - startBuildTime}"
	}

}

Task的依赖和执行顺序

dependsOn 强依赖方式

task taskX{
    doFirst {
        println 'taskX'
    }
}

task taskY{
    doFirst {
        println 'taskY'
    }
}

task taskZ(dependsOn: [taskX,taskY]){
	dependsOn this.tasks.findAll{
		task -> task.name.startsWith('lib')//动态依赖1️以lib开头的task
	}
    doFirst {
        println 'taskZ'
    }
}
//taskZ.dependsOn(taskX,taskY)
//此时taskX和taskY的顺序并不确定
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值