Kotlin Gradle


Gradle是基于Apache Ant和Apache Maven的项目自动化构建开源工具
使用特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置
面向Java应用为主
支持语言 Java、Groovy、Kotlin 和 Scala 未来将支持更多的语言

Gradle基于JVM的构建工具,通用灵活的构建工具,支持maven, Ivy仓库
支持传递性依赖管理 不需要远程仓库 不需要 pom.xml和ivy.xml配置文件
gradle 贡献
.可切换的,像maven的基于约定的构建框架,不锁住你(约定优于配置)
.强大的多工程的构建
.强大的依赖管理(基于Apache Ivy),最大的便利构建工程
.支持已有的Maven或Ivy仓库基础建设
.支持传递性依赖管理,不需要远程仓库和pom.xml和ivy配置文件的前提下
.具有广泛的领域模型支持你的构建
//docs.gradle.org/current/userguide/kotlin_dsl.html

什么是 DSL

DSL(Domain Specified Language)领域专用语言
是一种专注特定领域的语言
以极其高效的方式描述特定领域的对象、规则和运行方式的语言

什么是领域专用语言
DSL 是为了解决系统(硬件系统和软件系统)构建初期,使用者和构建者的语言模型不一致导致需求收集的困难
在构建证券交易系统的过程中,在证券交易活动中存在许多专业的金融术语和过程
现在要为该交易过程创建一个软件解决方案,开发者/构建者必须了解证券交易活动,涉及到哪些对象、之间的规则及约束条件
领域专家(证券交易专家)来描述证券交易活动中涉及的活动。
但领域专家习惯使用他们熟练的行业术语来表达,解决方案的构建者无法理解。
如果解决方案的模型构建者要理解交易活动,必须让领域专家用双方都能理解的自然语言来解释

解释的过程,解决方案的模型构建者就理解了领域知识
这个过程中双方使用的语言就被称为“共同语言”
共同语言称为解决方案模型构建者用来表达解决方案中的词汇的基础。
构建者将这些共同语言对应到模型中,在程序中就是模块名、在数据模型中就是实体名、在测试用例中就是对象

在需求收集的过程中,如果要成功构建模型,则需要一种领域专家和构建者(也就是通常的领域分析师/业务分析师)都能理解的“共同语言”
但是这种共同语言的创建过程没有保证,不能保证在收集过程中得到的信息完整的描述了领域活动中所有的业务规则和活动

如果能够让领域专家通过简单的编程方式描述领域中的所有活动和规则,那么就能在一定程度上保证描述的完整性
DSL 就是为了解决这个问题而提出的
常见的 DSL
软件构建领域 Ant
UI 设计师 HTML
硬件设计师 VHDL
DSL 的特点
用于专门领域,不能用于其他领域
表现力有限
不描述解答域,仅描述问题域
DSL 与通用编程语言的区别
DSL 供非程序员使用,供领域专家使用
DSL 有更高级的抽象,不涉及类似数据结构的细节
DSL 表现力有限,其只能描述该领域的模型,而通用编程语言能够描述任意的模型

DSL 分类
元语言抽象 是指通过一种语言来构建另一种语言
比如 Java 就是构建在 C 上的语言
从什么语言构建而来,这种构建来源的语言称为“宿主语言”
根据是否从宿主语言构建而来,DSL 分为
内部 DSL(从一种宿主语言构建而来)
外部 DSL(从零开始构建的语言,需要实现语法分析器等)
还有一种属于外部DSL的“非文本DSL”,即尽量使用图形化表述。比如 JetBrains 的 MPS。
通常所用的框架实际上就是一种内部 DSL
比如 Rails 框架就是基于 Ruby 的用于 Web 开发领域的内部 DSL

如何构建 DSL
构建DSL 要满足三个原则:
能够完整描述领域
简单易用
隐藏实现细节
何时使用 DSL
DSL 的构建难度比较大,从零构建不合适
建议使用比较完善的构建

背后的概念
DSL 是在需求分析阶段中为了解决需求收集过程中需求描述方
(遇到问题方/问题描述者[问题方通常是客户或用户,描述方常是出现该问题的行业的专家,两个角色可能是同一人,也可能是不同的人])
与解决方案提供方(构建者)间互相理解困难而设计的专门工具。
在需求收集中,首先需要理解问题方遇到的问题,然后将其映射到解决方案提供方的解决技术上。
用术语描述的话,问题描述者(描述领域活动的背景和问题)称为“领域专家”,其使用“行话”来说明;
解决方案提供者称为“模型构建者”,其通过对领域活动及其问题的理解,加上对技术解决方案的理解,提出解决方案模型。
该模型最终映射到技术方案中。
这个过程中的活动成为“领域分析/领域建模”。
目的是确定并理解领域中的重要元素、过程以及其关系
简单的领域建模
我(模型构建者/业务分析师):“你来描述一下日常工作/生活的活动和过程”
领域专家:(他会习惯使用行话来描述)
我:(不理解)”你能用我们日常使用的语言来描述一下吗?“
领域专家:(他仍然会习惯性的使用行话来进行解释)
我:(通过不断的询问手机领域信息(即问题域)以及问题)
我:(最终整理出领域模型[需求分析的结果],用技术方案(即解决域)对问题域中的问题设计出解决方案[最终的解决方案/产品/项目])
《领域专用语言实战》
//book.douban.com/subject/25741352/reading/

官网     //gradle.org/
开源/闭源     开源
License类别     Apache License 2.0
代码管理地址     //github.com/gradle/gradle
开发语言     Java, Groovy, Kotlin
更新频度     平均每月数次
特点
最为显著的特点是使用Groovy作为脚本构建语言,具有更好的扩展性
*支持多个工程
与Maven和Ivy兼容
通过task执行具体操作
解决多模块问题
解决依赖问题
支持多种语言的编译(Android的官方构建工具)
Gradle vs Maven
关于哪个更好的问题,有人说Maven更好
//www.softwareyoga.com/10-reasons-why-we-chose-maven-over-gradle/
也有人说Gradle更好,比如Gradle的官方比较:
//gradle.org/maven-vs-gradle/
Gradle的上升趋势,Ant已经日薄西山这是事实。
安装
前提条件
基于java的跨平台特性,Gradle可以运行在大部分主流的操作系统上,所需要的前提仅仅是JDK或者JRE:
版本依赖: JDK或JRE7及以上
Groovy: Gradle自带Groovy,无需自行安装,如果已经安装也会被Gradle所忽略。
安装方式
使用一些Package Manager进行安装,比如MacOS:
brew install gradle
或者sdk
sdk install gradle 4.10.2
也可用Gradle发布的二进制包,本文使用此种方式
比如当前4.10.2的官方下载路径:
//gradle.org/next-steps/?version=4.10.2&format=bin
如果速度很慢的话,试一下这个:
//services.gradle.org/distributions/gradle-4.10.2-bin.zip
环境变量设定
将gradle文件添加到PATH搜索路径中即可,比如可以如下方式写入profile中。
export GRADLE_HOME=/Library/gradle/gradle-4.10.2
export PATH=$PATH:${GRADLE_HOME}/bin
版本确认
使用gradle -v即可确认gradle版本和相关信息
$ gradle -v
Welcome to Gradle 4.10.2!
//docs.gradle.org/current/userguide/userguide.html