Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
CharonChui committed May 14, 2024
1 parent 66b1db4 commit 6e62714
Showing 2 changed files with 151 additions and 0 deletions.
27 changes: 27 additions & 0 deletions Gradle&Maven/Gradle专题.md
Original file line number Diff line number Diff line change
@@ -15,6 +15,12 @@ Gradle的版本在`gradle/wrapper/gradle-wrapper.properties`下:
gradle-wrapper是对Gradle的一层包装,便于在团队开发过程中统一Gradle构建的版本号,这样大家都可以使用统一的Gradle版本进行构建。
里面的distributionUrl属性是用于配置Gradle发行版压缩包的下载地址。

Gradle 是一个 运行在 JVM 的通用构建工具,其核心模型是一个由 Task 组成的有向无环图(Directed Acyclic Graphs).


![image](https://github.com/CharonChui/Pictures/blob/master/gradle_task_1.png?raw=true)


简介
---

@@ -35,6 +41,27 @@ Java程序员可以无缝切换到使用Groovy开发程序。Groovy说白了就

![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/android_build_process.png?raw=true)


说起来我们一直在使用Gradle,但仔细想想我们在项目中其实没有用gradle命令,而一般是使用gradlew命令,同时如下图所示,找遍整个项目,与gradle有关的就这两个文件夹,却只发现gradle-wrapper.jar。


那么问题来了,gradlew是什么,gradle-wrapper.jar又是什么?

wrapper的意思:包装。

那么可想而已,这是gradle的包装。其实是这样的,因为gradle处于快速迭代阶段,经常发布新版本,如果我们的项目直接去引用,那么更改版本等会变得无比麻烦。而且每个项目又有可能用不一样的gradle版本,这样去手动配置每一个项目对应的gradle版本就会变得麻烦,gradle的引入本来就是想让大家构建项目变得轻松,如果这样的话,岂不是又增加了新的麻烦?

所以android想到了包装,引入gradle-wrapper,通过读取配置文件中gradle的版本,为每个项目自动的下载和配置gradle,就是这么简单。我们便不用关心如何去下载gradle,如何配置到项目中。

至于gradlew也是一样的道理,它共有两个文件,gradlew是在linux,mac下使用的,gradlew.bat是在window下使用的,提供在命令行下执行gradle命令的功能

至于为什么不直接执行Gradle,而是执行Gradlew命令呢?

因为就像wrapper本身的意义,gradle命令行也是善变的,所以wrapper对命令行也进行了一层封装,使用同一的gradlew命令,wrapper会自动去执行具体版本对应的gradle命令。

同时如果我们配置了全局的gradle命令,在项目中如果也用gradle容易造成混淆,而gradlew明确就是项目中指定的gradle版本,更加清晰与明确


### Gradle的生命周期

1. Initialization:初始化阶段
124 changes: 124 additions & 0 deletions Gradle&Maven/kts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
Gradle 支持使用 Groovy DSL 或 Kotlin DSL 来编写脚本。所以在学习具体怎么写脚本时,我们肯定会考虑到底是使用 Kotlin 来写还是 Groovy 来写。

不一定说你是 Kotlin Android 开发者就一定要用 Kotlin 来写 Gradle,我们得判断哪种写法更适合项目、更适合开发团队人群(学习成本)。

所以下面来学习一下这两种语言的差异。

1. Groovy 和 Kotlin 的差异
1.1 语言差异
Groovy
Groovy是一种基于 JVM 的面向对象的编程语言,它可以作为常规编程语言,但主要是作为脚本的语言(为了解决 Java 在写脚本时过于死板)。它是一个动态语言,可以不指定变量类型。它的特性是支持闭包,闭包的本质很简单,简单的说就是定义一个匿名作用域,这个作用域内部可以封装函数和变量,外部不可以访问这个作用域内部的东西,但是可以通过调用这个作用域来完成一些任务。
Kotlin
Kotlin 则是 Java 的优化版,在解决 Kotlin 很多痛点的情况下,不引入过多的新概念。它具有强大的类型推断系统,使得语言有良好的动态性,其次是其语言招牌 —— 语法糖,Kotlin 的代码可以写的非常简洁。这使得 Kotlin 不仅做为常规编程语言能大放异彩,作为脚本语言也深受很多开发者喜爱。
它们共同特点就是基于JVM,可以和 Java 互操作。Gradle 能提供的东西, Kotlin 也能通过提供(闭包)。在功能上,两者能做的事情都是一样的。此外一些简单的差异有:

groovy 字符串可以使用单引号,而 kotlin 则必须为双引号
groovy 在方法调用时可以省略扩号,而 kotlin 不可省略
groovy 分配属性时可以省略 = 赋值运算符,而 kotlin 不可省略
groovy 是动态语言,不用导包,而 kotlin 则需要。



为什么要用Kotlin DSL写gradle脚本
撇开其他方面,就单从提高程序员生产效率方面就有很多优点:

脚本代码自动补全
跳转查看源码
动态显示注释
支持重构(Refactoring)
怎么样,要是你经历过groovy那令人蛋疼的体验,kotlin会让你爽的起飞,接下来让我们开始吧。

从Groovy到Kotlin
让我们使用Android Studio 新建一个Android项目,AS默认会为我们生成3个gradle脚本文件。

settings.gradle (属于 project)
build.gradle (属于 project)
build.gradle (属于 module)
我们的目的就是转换这3个文件

第一步: 修改groovy语法到严格格式
groovy既支持双引号""也支持单引号'',而kotlin只支持双引号,所以首先将所有的单引号改为双引号。

例如 include ':app' -> include ":app"

groovy方法调用可以不使用() 但是kotlin方法调用必须使用(),所以将所有方法调用改为()方式。

例如

implementation "androidx.appcompat:appcompat:1.0.2"
改为

implementation ("androidx.appcompat:appcompat:1.0.2")
groovy 属性赋值可以不使用=,但是kotlin属性赋值需要使用=,所以将所有属性赋值添加=。

例如

applicationId "com.ss007.gradlewithkotlin"
改为

applicationId = "com.ss007.gradlewithkotlin"
完成以上几步,准备工作就完成了。




1.2 文件差异
两者编写 Gradle 的文件是有差异的:

用 Groovy 写的 Gradle 文件是 .gradle 后缀
用 Kotlin 写的 Gradle 文件是 .gradle.kts 为后缀
两者的主要区别是:

代码提示和编译检查
.kts 内所有都是基于kotlin代码规范的,所以强类型语言的好处就是编译没通过的情况下根本无法运行。此外,IDE 集成后可以提供自动补全代码的能力
.gradle 则不会有代码提示和编译检查
源代码、文档查看
.gradle 被编译后是 JVM 字节码,有时候无法查看其源码
.kts 的 DSL 是通过扩展函数实现的(可以看这篇:Kotlin DSL 学习),IDE 支持下可以导航到源代码、文档或重构部分
对于写脚本的人来说,两者的差异不大,因为 Gradle 的 DSL 是 Groovy 提供的,后来的 Kotlin 并没有另起炉灶,而是写了一套 Kotlin 版的。所以两者在代码上也就只有所用语言的差异了,概念啥的都是一样的。

作为一名 Kotlin Android 开发者,我之后基本上是使用 Kotlin DSL 来学习写 Gradle 脚本,但是就跟我上面说的一样,了解其中一个后,要搞懂另外一个成本是很低的。


2. 基本命令
2.1 Project 、 Task 和 Action 介绍
Gradle 主要是围绕着 Project(项目)、Task(任务)、Action(行为)这几个概念进行的。它们的作用分别是:

project:每次 build 可以由一个或多个 project 组成。Gradle 为每个 build.gradle 创建一个相应的 project 领域对象,在编写Gradle脚本时,我们实际上是在操作诸如 project 这样的 Gradle 领域对象。
若要创建多 project 的项目,我们需要在 根工程(root目录)下面新建 settings.gradle 文件,将所有的子 project 都写进去(include)。在 Android 中,每个 Module 都是一个子 project。
task:每个 project 可以由一个或多个 task 组成。它代表更加细化的构建任务,例如:签名、编译一些java文件等。
action:每个 task 可以由一个或多个 action 组成,它有 doFirst{} 和 doLast{} 两种类型
————————————————































0 comments on commit 6e62714

Please sign in to comment.