新一代构建工具Gradle入门知识简介

新一代构建工具Gradle入门知识简介

笔者能力有限,如有错误,欢迎指正。

构建工具进化史

  • 第一代 Ant 2000

  • 第二代 Maven 2004

  • 第三代 Gradle 2012

    ANT

  • ant是出现最早的工具, 它在一些方面跟Make工具很相像。它在2000年发布,并在短时间内成为了最流行的Java项目构建工具。 它非常简单易学, 人们不需要专门去学习他, 就可以拿来使用。它基于编程的思想设计。

  • 后来发布的版本, 开始支持插件。

  • 它的主要缺点是配置文件使用XML, 从而导致了分级的架构, 从而不适于用编程的思想去使用它;另一个问题是在管理小项目的时候配置文件过于庞大臃肿。

    MAVEN

  • maven于2004年发布, 它起初的目的是解决程序员在使用ant时碰到的一些问题。

  • maven仍然使用xml作为配置文件规范, 但是架构不同了。ant要求开发者把构建过程中使用的所有命令都要在xml里描述,而maven主要依赖于一些默认设置和惯例, 大大减少了配置文件的体积。

  • maven最重要的一个特性是可以通过网络下载配置文件中描述的依赖, 这改变了源代码管理的方式。 不过ant通过ivy(依赖管理工具)也可以实现这个特性了。

    GRADLE

  • gradle结合了上边两个的优点, 同时基于DSL描述配置,以及其他的一些改进。 它拥有ant的灵活性和强大功能, 也有maven的生命周期管理和易用性。

  • 它在2012年一发布, 就在短期内获得了大量关注, 比如谷歌的android, 已经把gradle做为了android studio的官方构建工具。

  • gradle不使用xml作为配置文件,它使用基于Groovy开发的DSL, 所以gradle的配置文件比ant和maven的更加高效和简洁。 由于该DSL是专门为它开发的, 所以它的配置文件要比ant和maven少得多,在整个开发、测试、打包、部署的整个生命周期都是如此。

  • 它跟ant一样,使用了ivy作为jar包的依赖管理工具。

为何选择Gradle

  • Gradle产生较晚,充分吸取了ant和maven的优点
  • Gradle语法简洁,可读性更大
  • Gradle拥有更大的自定义能力,新增功能比较方便
  • Gradle充分吸收了约定大于配置的思想,而配置即代码又提供了更多的灵活性
  • 对比报告:https://gradle.org/maven-vs-gradle/
  • 性能比较:https://gradle.org/gradle-vs-maven-performance/
  • 总而言之一句话,Gradle不仅配置精炼简洁,还具有更好的灵活性与可扩展性,结合了ant和maven的优点,加快项目的自动化构建。
  • 从Maven迁移到Gradle:https://guides.gradle.org/migrating-from-maven/

Gradle

  • Gradle是一个构建工具,专注于自动化构建,支持多语言开发。

  • Gradle提供了一个灵活的模型支持在任何平台上构建,测试,发布和部署软件,支持从编译到打包到发布网站的整个开发生命周期。

  • Gradle旨在支持跨多种语言和平台(包括Java,Scala,Android,C / C ++和Groovy)的构建自动化,并与开发工具和持续集成服务器(包括Eclipse,IntelliJ和Jenkins)紧密集成。

  • Gradle 是一个编译打包工具,但实际上它也是一个编程框架。Gradle 有自己的 API 文档:https://docs.gradle.org/current/dsl/

  • 官网地址:https://gradle.org/

  • Github:https://github.com/gradle/gradle

  • 用户手册:https://docs.gradle.org/current/userguide/userguide.html

    特征

    • 按约定声明构建和建设;
    • 强大的支持多工程的构建;
    • 强大的依赖管理(基于Apache Ivy),提供最大的便利去构建工程;
    • 全力支持已有的 Maven 或者Ivy仓库基础建设;
    • 支持传递性依赖管理,在不需要远程仓库和pom.xml和ivy配置文件的前提下;
    • 基于groovy脚本构建,其build脚本使用groovy语言编写;
    • 具有广泛的领域模型支持构建;
    • 深度 API;
    • 易迁移;
    • 自由和开放源码,Gradle是一个开源项目,基于 ASL 许可
    • 更多详情请访问:https://gradle.org/features/

    安装

    • 请确保已安装配置好jdk1.7+
      命令行工具安装
      • 官方安装说明:https://gradle.org/install/
      下载文件安装
      • gradle下载地址:http://services.gradle.org/distributions/
      • 安装步骤:1-下载 ,2-解压,3-配置 ,4-测试
      • 以下以windows为例作下环境搭建说明:
        • 下载Gradle版本文件
        • 解压文件
        • 新增环境变量GRADLE_HOME,存放gradle的解压路径
        • 将GRADLE_HOME\bin加入到环境变量Path中
        • CMD中输入“gradle -v”,如果出现版本号则表示已经搭建完毕

    新建工程

    • 官方文档:https://guides.gradle.org/creating-new-gradle-builds/

    默认任务

    gradle的任务支持简写,如gradle assemble与gradle ass是一致的,gradle assembleDebug与gradle aD是一致的

    • gradle tasks //Displays the tasks runnable from root project

    • gradle projects //Displays the sub-projects of root project

    • gradle init //Intializes a new Gradle build

    • gradle wrapper //Generate Gradle wrapper files

    • gradle properties //Displays the properties of root project

    • gradle help // declared in root project

    • gradle model //Displays the configuration model of root project

    • gradle dependentComponents//Displays the dependent components of components in root project

    • gradle dependencyInsight//Displays the insight into a specific dependency in root project

    • gradle dependencies //Displays all dependencies in root project

    • gradle components // Displays the components produced by root project

    • gradle buildEnvironment // Displays all buildscript dependencies declared in root project

    • 以上是gradle的默认任务,其他定制任务都需要自己实现,如清空构建时生成的目录可定义如下任务:

      //clean任务示例
      task clean(type: Delete) {
          delete rootProject.buildDir
      }
      
    • 多模块工程可以通过如下方式执行任务

         gradle :mySubproject:taskName
      

    配置gradle.properties

    Gradle Wrapper

    • Gradle Wrapper顾名思义是gradle的包装,是为了解决兼容性问题,可以让用户在机子没有Gradle配置环境的情况下使用gradle工程
    • wrapper会以/gradle/wrapper/gradle-wrapper.properties中声明的gradle路径(distributionUrl)下载指定gradle版本
    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-bin.zip
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    
    • 如果用户工程目录下没有gradlew和gradlew.bat文件,则用户可以通过执行 gradle wrapper生成这两个文件,其中gradlew是一个shell脚本,可以在unix和linux中使用,gradlew.bat则是在windows中使用
      在这里插入图片描述

    • 通过gradlew可以替代gradle(用法与gradle完全一致,只是把gradle改为gradlew即可,有些系统需要为./gardlew),以解决本机没有安装gradle的问题

    构建周期

    • Gradle的构建清晰的分为三个阶段:

      • 初始化阶段
        Gradle提供了单项目和多项目的构建,在初始化阶段,他要决定哪些项目要参与到构建中来,并创建这些项目的实例
      • 配置阶段
        在这个阶段需要参与到本次构建的项目的构建脚本将会被执行,这些项目的对象将被配置,这个特性叫做configuration on demand
      • 执行阶段
        Gradle为在配置阶段创建和配置的任务再次筛选需要执行的任务的子集,这个子集的筛选是由在命令行下传递给Gradle的任务名和目录决定的,子集中的每个任务都会被执行
    • 不同任务之间可能相互依赖,因此在配置阶段Gradle会产生依赖关系图,没有依赖的任务通常会被优先执行,被依赖的任务优先依赖任务执行,一旦一个任务被执行过就不会再次执行

    • https://docs.gradle.org/current/userguide/build_lifecycle.html

    Gradle build scan

    • gradle build scan是一个在线查看构建过程中详细信息的工具,包括当前构建的环境,使用的版本,错误日志,task执行情况以及优化建议等。
    • 官方文档:https://guides.gradle.org/creating-build-scans/
    • 使用步骤
      • 添加插件

        //build.gradle文件
        plugins {
            id 'com.gradle.build-scan' version '1.16' 
        }
        
        buildScan {
            termsOfServiceUrl = 'https://gradle.com/terms-of-service'
            termsOfServiceAgree = 'yes'
        }
        
      • 执行命令

        gradle build --scan
        
      • 成功后在窗体上会显示在线访问路径

    插件

    • 我们经常会看到诸如apply plugin: 'java’的插件声明,通过以上脚本应用之后,java插件会为你的工程添加很多有用的默认配置和约定,比如源代码的位置,单元测试代码的位置,资源文件的位置等
    • java插件约定的项目结构:
    example
    	- build.gradle
    	- src
    		- main
    			- java
    			- resources
    		- test
    			- java
    			- resources 
    
    • 其中main和test是java插件为我们内置的两个源代码集合,如果你想自定义一个(比如aaa),则可以通过如下脚本后,就可以仿照main和test,只是一般不建议这么做。
    apply plugin:'java'
     
    sourceSets{
    	aaa{
    	} 
     }
    

    Gradle依赖模式

    • 可以为不同源集指定不同的依赖,比如mainCompile即为main源集(sourceSet)指定特定的依赖

    • 依赖方式

      • 远程依赖
        compile (‘org.springframework.boot:spring-boot-autoconfigure’)
      • 工程依赖
        compile project(‘:example’)
      • 本地依赖
        compile files(‘libs/exa-1.0.jar’,‘libs/exa-2.0.jar’)
        compile fileTree(dir:‘libs’,include:‘*.jar’)

    多项目构建

    • 如果我们有一个包含多模块的工程,比如a,b,c三个模块工程,每个模块工程都有自己的build.gradle文件,每个build.gradle之中都有一些通用的配置是一模一样的,此时需要有一个公共的build.gradle用来管理这三个模块

    • 假设有一个工程master,有两个子模块module1,module2,那么一般的目录结构如下

      master 
      	- build.gradle 			//所有子模块通用的
      	- settings.gradle 		//声明所有子模块
      	- module1
      		- build.gradle		//子模块自己独立的
      	- module2
      		- build.gradle 		//子模块自己独立的 
      
    • 其中settings.gradle内容如下:

      include ':module1', ':module2'
      

    缓存

    • gradle可以使用缓存极大地提高构建速度,但用户有时如果不想启用缓存可以通过如下方式关闭:
      在gradle.properties中添加org.gradle.caching=false即可
    • 详情访问:https://docs.gradle.org/current/userguide/build_cache.html

    插件

    • 插件搜索(速度奇慢):https://plugins.gradle.org/
    • 官方插件:https://docs.gradle.org/current/userguide/plugin_reference.html

    小技巧

    • 查询依赖库最新版本:maven仓库:https://mvnrepository.com/
    • 自定义maven库路径
      maven{
      	url "..."
      }
      

DSL

  • DSL的全称是domain-specific language,它在wiki上的定义如下:
    A domain-specific language (DSL) is a computer language specialized to a particular application domain.
    与之相对的是GPL(general-purpose language)。
    DSL指的是针对特定应用领域而设计使用的计算机语言,而GPL指的是针对跨应用领域而设计使用的计算机语言。
    常见的DSL有:HTML,Shell,make语言,ant语言,maven语言,rpm语言,dpkg语言,awk语言,正则表达式,dc计算机语言等,有些DSL语言又被称为微型语言
    常见的GPL有:Java,C等

  • https://docs.gradle.org/current/dsl/

  • https://docs.gradle.org/current/userguide/groovy_build_script_primer.html

  • gradle是使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置

  • 除了Groovy,gradle后面还支持了kotlin的DSL(gradle5.0后开始支持)

  • 当在build.gradle中声明如下时

    aaa 'bbb'  ccc 'ddd' eee 'fff'
    
  • 实际上就是aaa(‘bbb’).ccc(‘ddd’).eee(‘fff’)

groovy

  • 试用groovy语法的话可以在idea的tools中找到groovy console
  • groovy不需要分号,括号是可选的
  • groovy默认以最后一个值作为返回值
  • groovy是弱类型的,用def表示
  • 使用“==”判断相等时不会引起空指针异常
  • 可以使用assert
  • 单引号表示纯粹的字符串,双引号可以在里面使用变量,三引号支持换行

问答

问:如何查看任务之间的依赖?

  • 答:命令行输入“gradle(w) taskname -m”,如gradlew build -m即可查看到任务build之前需要执行的任务列表。

问:很多人都会奇怪,到底build.gradle里使用的插件究竟放置在哪里?

  • 答: Mac系统默认下载到:/Users/(用户名)/.gradle/caches/modules-2/files-2.1
    Windows系统默认下载到:C:\Users(用户名).gradle\caches\modules-2\files-2.1

问:你会不会好奇在build.gradle里完全看不出springboot依赖的版本信息,那么版本管理具体是在哪里指定的呢?

  • 答:windows用户在C:\Users(用户名).gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-dependencies目录下可以找到答案,当我们打开spring-boot-dependencies-x.x.x.RELEASE.pom文件,版本信息一目了然
    在这里插入图片描述

参考

十分钟理解Gradle - Bonker - 博客园
https://www.cnblogs.com/Bonker/p/5619458.html
Gradle教程™
https://www.yiibai.com/gradle/
Gradle - DSL - Jeanboy - CSDN博客
https://blog.csdn.net/freekiteyu/article/details/81066845

写出gradle风格的groovy代码 - 番茄沙司 - 博客园
https://www.cnblogs.com/zqlxtt/p/5741306.html
[Gradle中文教程系列]-跟我学Gradle-5.3:依赖-管理依赖的版本(传递(transitive)\排除(exclude)\强制(force)\动态版本(+)) - 如是我闻 - CSDN博客
https://blog.csdn.net/pkaq_/article/details/53906668

Android Gradle 下载的依赖包位置 - 简书
https://www.jianshu.com/p/e8db626d768f

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值