gradle experience

2024-01-05 22:33
文章标签 gradle experience

本文主要是介绍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 = 18eat("pingguo")
}task task1 {Person person = new Person(name:"lilei", age:14)println(person.toString())cc.delegate = personcc.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运用在组件化中丨慕课网教程

这篇关于gradle experience的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/574368

相关文章

Gradle的基本使用

新建一个项目后,在项目文件夹下创建build.gradle文件,并加入内容:       apply plugin: 'eclipse'。    然后在终端运行gradle eclipse即可构建eclipse IDE的开发环境。    gradle默认值:gradle有些目录是有默认值存在,建议项目的配置,承袭了maven的风格,如:         java的源码目录:src/mai

使用gradle做第一个java项目

涉及到的任务如下: assemble任务会编译程序中的源代码,并打包生成Jar文件,这个任务不执行单元测试。 Total time: 5.581 secs E:\workspace\Test>gradle assemble :compileJava :processResources UP-TO-DATE :classes :findMainClass :jar :b

Gradle的安装和配置

Gradle是一个基于JVM的构建工具,它提供了: 像Ant一样,通用灵活的构建工具可以切换的,基于约定的构建框架强大的多工程构建支持基于Apache Ivy的强大的依赖管理支持maven, Ivy仓库支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件。对Ant的任务做了很好的集成基于Groovy,build脚本使用Groovy编写有广泛的领域模型支持构建 G

兔子-build.gradle中代码的含义

//声明构建的项目类型,这里当然是android了apply plugin: 'com.android.application'//设置编译android项目的参数android {// SDK的版本号,也就是API Level,例如API-19、API-20、API-21等等。compileSdkVersion 23//构建工具的版本,其中包括了打包工具aapt、dx等等。// 这个工具的目

Android Studio打开Modem模块出现:The project ‘***‘ is not a Gradle-based project

花了挺长时间处理该问题,特记录如下:1.背景: 在Android studio 下导入一个新增的modem模块,如MPSS.DE.3.1.1\modem_proc\AAA, 目的是看代码方便一些,可以自由搜索各种关键字。但导入该项目时出现了如下错误: The project '***' is not a Gradle-based project.造成的问题: (1) project 下没有代码,而

【Flutter】解决第一次运行项目很慢(gradle需要下载依赖)

配置gradle默认下载路径 默认下C盘谁顶得住 配置环境变量 名称: GRADLE_USER_HOME 值: D:\Develop\gradle 自己创建一个 下边是重点 配置gradle远端下载地址 后边版本号自己换 https://mirrors.cloud.tencent.com/gradle/ https://mirrors.cloud.tencent.com/gradle/g

Android Studio下载Gradle失败问题解决

问题说明 使用 Android Studio 构建程序报错如下 Could not install Gradle distribution from 'https://services.gradle.org/distributions/gradle-7.5.1-bin.zip'.Reason: java.net.SocketTimeoutException: Connect timed ou

gradle dsl

仅仅是为了 提取 一些 gradle语法 compileSdkVersion: "23" as int, compileSdkVersion Integer.parseInt(ANDROID_BUILD_COMPILE_SDK_VERSION)minSdkVersion Integer.parseInt(MIN_SDK_VERSION)targetSdkVersion Intege

利用libs.versions.toml配置gradle

在新建项目时,我发现了一种较为简洁的gradle依赖配置方式——libs.version.toml。 该文件存储在项目级别的gradle -> libs.versions.toml路径下。在一个toml文件中包含三个级别:version、libraries和plugins。分别用于存储依赖库的版本号、名称以及插件名称。 此处我们以datastorePrefences依赖库为例,不使用toml文

经验笔记:Maven 与 Gradle —— Java 构建工具对比

经验笔记:Maven 与 Gradle —— Java 构建工具对比 引言 在 Java 开发过程中,选择合适的构建工具对于提升开发效率、保证构建一致性以及简化项目管理至关重要。Maven 和 Gradle 是目前最常用的 Java 构建工具,它们不仅能够自动化构建过程,还能有效管理项目依赖。本文将详细介绍这两种工具的基础知识,并对比它们的异同,帮助开发者更好地理解并选择合适的构建工具。 M