• Gradle新手指南


    Gradle是什么?

    Gradle 是一个JVM语言(比如Java、Groovy或者Scala)的自动化构建工具。Gradle可以被配置以运行任务(Tasks),比如编译jar包,运行测试用例,创建文档等等。

    使用InteliJ来创建一个使用Gradle的项目

    当用intelij创建新的项目的时候,你可以从左边的选项中选择gradle,并且选择你想使用的语言:

    在这里插入图片描述

    创建完你的项目后,InteliJ会为你创建一个build.gradle文件,其中有你选择的语言相关的一些很有用的默认配置,让我们来看看build.gradle文件。我将在示例中使用Java,其它语言其实也类似。

    build.gradle文件是所有的魔法发生的地方,这是InteliJ为java语言创建的默认的文件:

    plugins {
      id 'java'
    }
    
    version '1.0-SNAPSHOT'
    
    sourceCompatibility = 1.8
    
    repositories {
      mavenCentral()
    }
    
    dependencies {
      testCompile group: 'junit', name: 'junit', version: '4.12'
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这个文件是什么意思?里面的语法从哪里来的?

    Groovy上手

    Gradle构建脚本是用Groovy写的,一个类似Java的JVM语言,但是有着更简洁的语法。让我们先学一些基本知识,从而能更好的理解Gradle脚本是怎么运行的:

    Groovy控制台

    你可以在InteliJ中的groovy控制台中体验groovy脚本,在InteliJ的tools->groovy console中可以打开groovy控制台:

    在这里插入图片描述

    合法的Java就是合法的Groovy

    在控制台,我们可以输入任何合法的Java代码:

    在这里插入图片描述

    点击绿色的运行按钮,在底部的窗口会有如下的输出:

    在这里插入图片描述

    有一点需要注意的是,我们没有在运行的代码外用class和main方法包裹它。我们还可以更进一步。Groovy自动帮我们导入了System.out,所以我们可以省略System.out:

    println("hello groovy");
    
    • 1

    在Groovy中,一个参数的方法调用,圆括号和分号都可以省略,所以我们可以将System.out.println("hello groovy")简写成

    println "hello groovy",够时髦吧?

    Groovy闭包(Closure)

    理解Groovy的闭包就能够使得build.gradle中发生的事情不再神秘。

    如果你使用过Java8的lambda表达式,就会感觉groovy闭包似曾相识——它们能够让你像处理正常值一样去处理方法(所以你可以将闭包作为参数传递给其它方法)。让我们来看一个例子:

    在Groovy控制台,我们定义一个类:

    class MyClass {
      
    }
    
    • 1
    • 2
    • 3

    让我们添加一个方法,入参是闭包:

    class MyClass {
      void doSomething(Closure closure) {
        closure.call()
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们可以通过closure.call()运行任何代码,那么我们怎么使用它呢?我们需要创建一个MyClass实例,然后调用doSomething方法:

    class MyClass {
      void doSomething(Closure closure) {
        closure.call()
      }
    }
    
    myClass = new MyClass()
    
    myClass.doSomething {
      println "doing something"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    控制台会输出:

    > class MyClass {
    >     void doSomething(Closure closure) {
    >         closure.call()
    >     }
    > }
    > 
    > myClass = new MyClass()
    > 
    > myClass.doSomething {
    >     println "doing something"
    > }
    doing something
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    我们调用闭包的代码和下面的是否有点像?

    dependencies {
      testCompile group: 'junit', name: 'junit', version: '4.12'
    }
    
    • 1
    • 2
    • 3

    dependencies就是一个方法,它的入参是一段代码块(其实就是一个闭包)。在代码块中,我们调用了testCompile方法,testCompile方法的入参就是group:'junit',name:'junit',version:'4.12'(group,name,version部分其实就是groovy map的简写方式,本质上就是一个kv对)。

    Gradle的核心:Projects和Tasks

    现在我们已经较好地理解了groovy语法是怎么工作的了,让我们来深入研究一下build.gradle文件。

    build.gradle文件和project对象有一一对应的关系,project对象表示了我们项目(指IDEA中的项目)的信息。如果你使用过Maven(另一个Gradle要兼容的流行的构建工具),你将认识到,这个主意来自于pom.xml文件(工程对象模型),pom.xml文件的作用和build.gradle基本上是一样的。

    每一个project(Gradle的project概念)由一系列的Tasks组成:Task代表了构建我们开发的项目的时候需要执行的一系列不可分割的工作单元。

    Gradle的项目对象模型(project object model)中有很多默认的Tasks,我们可以通过运行下面的命令来看看有哪些任务(本地安装了gradle,并且在命令行中可以执行gradle命令,在IDEA打开gradle项目的Terminal中执行):

    >gradle tasks
    
    • 1

    如果你的项目的build.gradle文件是空的(比如你删除了它的内容),运行gradle tasks将会输出:

    在这里插入图片描述

    tasks任务展示了一个项目可用的所有的Tasks。真正的魔法在添加了java plugin后发生:

    plugins {
      id 'java'
    }
    
    • 1
    • 2
    • 3

    引用Java插件,将会添加很多我们可以使用的额外的tasks。现在再运行gradle tasks,将会输出:

    在这里插入图片描述

    这些是许多Java项目都可能会使用到的有用的默认tasks。

    关键的要点是,我们可以通过修改build.gradle脚本来修改项目对象模型——因为在Gradle中代码即配置。

    可以在https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_usage中查看Java插件的完整文档。

    属性

    和Tasks一样,我们的项目对象也有"properties"(属性),属性也表达了我们项目的一些信息。比如一些简单的属性,version、sourceCompatibility:

    version '1.0-SNAPSHOT'
    
    sourceCompatibility = 1.8
    
    • 1
    • 2
    • 3

    还有一些更复杂的属性,通过一些接受闭包的方法来修改。在我刚开始使用Gradle的时候,sourceSets属性的一些魔法使我困惑,这个属性是Java插件添加的。sourceSets属性定义了Gradle将从哪里寻找你的源码。默认情况下,Gradle遵从Maven的约定,即从src/main/java目录寻找源码,从src/test/java寻找测试用例。

    但是假设我们把源码放到了my-java-directory目录下(实际使用中,我不推荐这样放置源码),或者我们接手了遗留项目(它的源码没有遵从Maven约定放在src/main/java)。我们可以告诉Gradle去指定的目录下寻找源码:

    sourceSets {
      main {
        java {
          srcDir "my-java-directory"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    和Tasks一样,我们可以通过下面的命令查看完整的gradle的属性列表(注意,这个列表会很大):

    >gradle properties
    
    • 1

    自定义Tasks

    我们可以通过Tasks来实现同样的定制化魔法。当构建我的井字游戏控制台项目的时候,我在寻找一个通过Gradle来方便地运行程序的方式——application插件有一个遍历的task叫run

    然而,它需要配置指明System.in作为标准输入。增加下面这行让我重新配置了run任务:

    run {
      standardInput = System.in
    }
    
    • 1
    • 2
    • 3

    这儿需要重点强调的是,Tasks也有它们自己的属性,并且允许我们配置。

    创建一个新的Task

    我们也可以创建我们自定义的任务,既可以从头开始创建,也可以扩展已有的任务,后者更常用。上面的run任务实际上扩展了更底层的任务类型,叫做JavaExec。我们可以像下面这样定义上面的run任务同样的Task:

    task customRun(type: JavaExec){
    	classpath = sourceSets.main.runtimeClasspath
      standardInput = System.in
      main = 'tictactoe.cli.Main'
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这为项目对象增加了一个customRun任务,我们可以通过gradle命令使用它:

    >gradle customRun
    
    • 1

    这和之前的run任务的效果一样。

    结论

    Gradle的api是很多的,并且一开始很难掌握。这篇文章只是触及皮毛,但是希望能让Gradle中的语法和概念对于你来说不那么神秘,从而可以让理解Gradle文档更容易一点。

    更优秀的指南请参考Gradle官网:https://gradle.org/guides/。


    本文翻译自:https://medium.com/@andrewMacmurray/a-beginners-guide-to-gradle-26212ddcafa8

  • 相关阅读:
    elementui时间日期组件右边自定义图标
    C++——计时程序
    矩阵的运算规则
    Matlab|基于时间序列预测的粒子群优化混合非线性回归和自回归技术的比较
    【无标题】
    课程学习前言
    什么样的企业最需要MES?
    Qt creator下载安装
    Unknown module(s) in QT : datavisualization解决
    【vue】 vue2 监听滚动条滚动事件
  • 原文地址:https://blog.csdn.net/lzufeng/article/details/126450575