gradle experience

gradle 中的DSL 是Groovy

其中两个概念:

  1. 取值运算符${}。
    在单引号及三引号中不起作用,只在双引号中有效。
  2. 闭包

    Groovy中的闭包是用{参数列表 -> 代码体}表示的代码块,
    当参数 <= 1个时,-> 箭头可以省略,
    同时当只有一个参数时,如果不指定参数名默认以it为参数名,
    在Groovy中闭包对应的类型是Closure,所以闭包可以作为参数传递,
    同时闭包有一个delegate字段,  通过delegate可以把闭包中的执行代码委托给任意对象来执行。
    另外闭包的介绍:[Android Gradle] 搞定Groovy闭包这一篇就够了 - 简书


以下介绍闭包的概念,参考来源两处:

Groovy 闭包 - 简书

[Android Gradle] 搞定Groovy闭包这一篇就够了 - 简书

闭包的几种写法及使用方法:

{ item++ }                                          

{ -> item++ }                                       

{ println it }                                      

{ it -> println it }                                

{ name -> println name }                            

{ String x, int y ->                                
    println "hey ${x} the value is ${y}"
}

{ reader ->                                         
    def line = reader.readLine()
    line.trim()
}

同时对于闭包,其隐式参数it总是存在,即使我们省去->操作符。除非我们显式在闭包的参数列表上什么都不指定。

def magicNumber = { -> 42 }  //显示指定闭包没有参数

使用可变参数的闭包

def concat1 = { String... args -> args.join('') }  //可变参数,个数不定

我们可以将闭包赋给变量,然后可以将变量作为函数来调用,或者调用闭包的call方法也可以调用闭包。闭包实际上是groovy.lang.Closure类型,泛型版本的泛型表示闭包的返回类型。

def fun = { println("$it") }
fun(1234)

Closure date = { println(LocalDate.now()) }
date.call()

Closure<LocalTime> time = { LocalTime.now() }
println("now is ${time()}")

groovy 闭包可以修改委托对象和委托策略。

  • this 永远是指向定义该闭包的类,如果存在内部类,则是最内层的类,但this不是指当前闭包对象

  • owenr 永远是指定义该闭包的类或者闭包,顾名思义,闭包只能定义在类中或者闭包中

  • delegate 默认是指owner,可以自己设置。就是将闭包和一个具体的对象关联起来

delegate: n. 代表、委员会成员;v. 授权,把...委托给;选派(某人做某事)

class Person {
	String name;
	int age;
	void eat(String food) {
		println("你喂的${food}真难吃")
	}

	String toString() {
		return name + " " + age;
	}
}

def cc = {
	name = "hanmeimei"
	age = 18
	eat("pingguo")
}

task task1 {
	Person person = new Person(name:"lilei", age:14)
	println(person.toString())

	cc.delegate = person
	cc.call()
	println(person.toString())
}



输出结果:

lilei 14
你喂的pingguo真难吃
hanmeimei 18

其中闭包的delegate 写法:cc.delegate = person

可以理解为“名称为cc 的闭包的分配对象 =  person”

上面的结果就是为了说明:在闭包(cc) 中可以访问被代理对象(person) 的属性和方法

对于项目中的build.gradle 文件中的语法,比如:


plugins {
    id 'java-library' 
}
 
repositories {
    mavenCentral() 
}
 
dependencies {
    testImplementation 'junit:junit:4.13.1' 
 
    api 'org.apache.commons:commons-math3:3.6.1' 
 
    implementation 'com.google.guava:guava:30.0-jre' 
}

其中pluginsrepositoriesdependencies,都是方法,后面跟的大括号,不是方法体,而是方法的参数,是一个闭包参数,这里省略了括号。

id 'java-library'  就是调用一个id的方法而已。

参考:build.gradle配置文件与Groovy闭包语法之间的关系_⑥②专栏-CSDN博客

build.gradle 中的代码是否为标准groovy:

Gradle 创建 Task 的写法不是 Groovy 的标准语法吧? - 云+社区 - 腾讯云


以下参考:Gradle的快速入门学习 - 掘金

gradle init 会自动生成模板,包含以下内容

gradle 生成的项目的结构:

build.gradle

表示Gradle的项目,构建脚本

一个build.gradle就对应一个项目,

build.gradle放在Gradle项目的根目录下,表示它对应的是根项目,

build.gradle放在Gradle项目的其他子目录下,表示它对应的是子项目

settings.gradle

它表示Gradle的多项目配置脚本

存放在Gradle项目的根目录下,

在里面可以通过include来决定哪些子项目会参与构建

Gradle构建时会为settings.gradle创建一个对应的Settings对象,include也只是Settings接口中的一个方法。

Gradle Wrapper

使用Gradle Wrapper后,就可以统一项目在不同用户电脑上的Gradle版本,同时不必让运行这个Gradle项目的人安装配置Gradle环境

gradle init执行时会同时执行wrapper任务

wrapper任务会创建gradle/wrapper目录

并创建gradle/wrapper目录下的gradle-wrapper.jar、gradle-wrapper.properties这两个文件,

还同时创建gradlew、gradlew.bat这两个脚本,它们统称为Gradle Wrapper,是对Gradle的一层包装。

Gradle Wrapper的作用就是可以让你的电脑在不安装配置Gradle环境的前提下运行Gradle项目,

例如当你的Gradle项目被用户A clone下来时,而用户A的电脑上没有安装配置Gradle环境,用户A通过Gradle构建项目时,Gradle Wrapper就会从指定下载位置下载Gradle,并解压到电脑的指定位置,然后用户A就可以在不配置Gradle系统变量的前提下在Gradle项目的命令行中运行gradlew或gradlew.bat脚本来使用gradle命令,假设用户A要运行gradle -v命令,在linux平台下只需要运行./gradlew -v,在window平台下只需要运行gradlew -v,只是把gradle替换成gradlew

Gradle Wrapper的每个文件含义如下:

1、gradlew:用于在linux平台下执行gradle命令的脚本;

2、gradlew.bat:用于在window平台下执行gradle命令的脚本;

3、gradle-wrapper.jar:包含Gradle Wrapper运行时的逻辑代码;

4、gradle-wrapper.properties:用于指定Gradle的下载位置和解压位置;

        

Gradle的多项目配置

build.gradle 中有两个函数

allprojects

和subprojects

allprojects的配置包括根项目而subprojects的配置不包括根项目

Task

Gradle中主要有Project和Task对象,

Project是Gradle中构建脚本的表示,一个构建脚本(build.gradle)对应一个Project对象,

Task是Gradle中最小的执行单元,它表示一个独立的任务,

Project为Task提供了执行的上下文。


Task是Gradle中最小执行单元,它是一个接口,默认实现类为DefaultTask

在Project中提供了task方法来创建Task,

所以Task的创建必须要处于Project上下文中(每个build.gradle 就相当于一个project 对象。gradle 中主要有Project 和Task 对象)

自定义Plugin

我们平时是在build.gradle中通过apply plugin: 'Plugin名' 来引用一个Plugin,

而apply plugin中的apply就是指apply方法中的逻辑,

而apply方法的参数project指的就是引用该Plugin的build.gradle对应的Project对象


另外比较不错的教程:

Gradle运用在组件化中丨慕课网教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值