Gradle概述

作者: 小村医 | 来源:发表于2019-07-31 14:17 被阅读7次

    Gradle是一个开源的构建自动化工具,专注于灵活性和性能。Gradle构建脚本使用GroovyKotlin DSL 编写。

    • 高度可定制 - Gradle以一种可以以最基本的方式定制和扩展的方式建模。
    • 快速 - Gradle通过重用先前执行的输出,仅处理已更改的输入以及并行执行任务来快速完成任务。
    • 功能强大 - Gradle是Android的官方构建工具,并支持许多流行的语言和技术。

    安装Gradle

    您可以在Linux,macOS或Windows上安装Gradle构建工具。

    先决条件

    Gradle在所有主要操作系统上运行,只需运行Java Development Kit 8或更高版本。检查,运行java -version。你应该看到这样的东西:

    $ java-version
    java version "1.8.0_191"
    Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
    

    Gradle附带了自己的Groovy库,因此不需要安装Groovy。Gradle忽略任何现有的Groovy安装。

    Gradle使用它在路径中找到的任何JDK。或者,您可以将JAVA_HOME环境变量设置为指向所需JDK的安装目录。

    使用包管理器进行安装

    Homebrew

    $ brew install gradle
    

    手动安装

    1. 下载最新的Gradle版本

    2.解压zip包

    将分发zip文件解压缩到您选择的目录中,例如:

    $ mkdir /opt/gradle
    $ unzip -d /opt/gradle gradle-5.5.1-bin.zip
    $ ls /opt/gradle/gradle-5.5.1
    LICENSE  NOTICE  bin  getting-started.html  init.d  lib  media
    

    3.配置系统环境

    要运行Gradle,首先添加环境变量GRADLE_HOME。这应该指向Gradle网站上的解压缩文件。接下来添加*GRADLE_HOME*/bin到您的PATH环境变量。通常,这足以运行Gradle。

    配置PATH环境变量以包含bin解压缩分发的目录,例如:

    $ export PATH=$PATH:/opt/gradle/gradle-5.5.1/bin
    

    4.验证安装

    打开控制台并运行gradle -v以运行gradle并显示版本,例如:

    $ gradle -v
    
    ------------------------------------------------------------
    Gradle 5.5.1
    ------------------------------------------------------------
    
    (environment specific information)
    

    创建新的Gradle项目

    1.初始化一个项目

    首先,让我们为新项目创建一个新的目录。

    ❯ mkdir basic-demo
    ❯ cd basic-demo
    

    现在我们可以使用Gradle的 gradle init 命令来生成一个简单的项目。然后查看生成的所有内容,以便知道发生了什么。

    ❯ gradle init 
    Starting a Gradle Daemon (subsequent builds will be faster)
    
    BUILD SUCCESSFUL in 3s
    2 actionable tasks: 2 executed
    

    如果你想使用 Kotlin DSL 脚本,可以使用 gradle init --dsl kotlin 命令。更多信息可以阅读 详细文档.

    这就是Gradle为您生成的内容。

    Groovy

    .
    ├── build.gradle
    ├── gradle
    │   └── wrapper
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradlew
    ├── gradlew.bat
    └── settings.gradle
    

    Kotlin

    .
    ├── build.gradle.kts
    ├── gradle
    │   └── wrapper
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradlew
    ├── gradlew.bat
    └── settings.gradle.kts
    

    build.gradle 用于配置当前项目的Gradle构建脚本
    gradle-wrapper.jar Gradle Wrapper可执行JAR
    gradle-wrapper.properties Gradle Wrapper配置属性
    gradlew 基于Unix的系统的Gradle Wrapper脚本
    gradlew.bat 适用于Windows的Gradle Wrapper脚本
    settings.gradle 用于配置Gradle构建的Gradle设置脚本

    2.创建一个任务

    Gradle提供了用于通过基于Groovy或Kotlin的DSL脚本创建和配置任务的API。 Project (项目)包括一组任务,每个任务执行一些基本操作。

    Gradle提供了一个任务库,您可以在自己的项目中配置它。例如,有一个名为Copy的核心任务类型,它将文件从一个位置复制到另一个位置。复制任务非常有用(参阅文档了解详细信息),但是在这里,让我们再次保持简单。执行以下步骤:

    1. 创建一个名为 src 的目录。
    2. src 目录中添加一个名为 myfile.txt 的文件。内容可以是任意的(甚至可以是空的),但是为了方便起见,可以添加一行Hello, World!
    3. 在你的 build.gradle 文件中定义一个类型为 Copy (注意首字母大写)名称为 copy 的任务来复制 src 目录到一个名为 dest 的目录(你不必去手动创建 dest 目录,因为任务会为你去创建)。

    build.gradle width Groovy

    task copy(type: Copy, group: "Custom", description: "Copies sources to the dest directory") {
        from "src"
        into "dest"
    }
    

    build.gradle.kts width Kotlin

    tasks.create<Copy>("copy") {
        description = "Copies sources to the dest directory"
        group = "Custom"
    
        from("src")
        into("dest")
    }
    

    在这里,groupdescription 您可以随便写,甚至可以忽略它们

    现在来执行您新建 copy 任务:

    $./gradlew copy
    > Task :copy
    
    BUILD SUCCESSFUL in 0s
    1 actionable task: 1 executed
    

    们可以检查一下 dest 目录中是否存在名为 myfile.txt 的文件并且它的内容和 src 目录中的文件一样,来验证 copy 任务是否成功执行。

    探索和调试项目

    发现可用的任务

    tasks 命令可以列出了可用的Gradle任务,包括您刚刚添加的自定义任务。

    $ ./gradlew tasks
    
    > Task :tasks
    
    ------------------------------------------------------------
    All tasks runnable from root project
    ------------------------------------------------------------
    
    Build Setup tasks
    -----------------
    init - Initializes a new Gradle build.
    wrapper - Generates Gradle wrapper files.
    
    Custom tasks
    ------------
    copy - Copies sources to the dest directory
    
    Help tasks
    ----------
    buildEnvironment - Displays all buildscript dependencies declared in root project 'basic-demo'.
    components - Displays the components produced by root project 'basic-demo'. [incubating]
    dependencies - Displays all dependencies declared in root project 'basic-demo'.
    dependencyInsight - Displays the insight into a specific dependency in root project 'basic-demo'.
    dependentComponents - Displays the dependent components of components in root project 'basic-demo'. [incubating]
    help - Displays a help message.
    model - Displays the configuration model of root project 'basic-demo'. [incubating]
    projects - Displays the sub-projects of root project 'basic-demo'.
    properties - Displays the properties of root project 'basic-demo'.
    tasks - Displays the tasks runnable from root project 'basic-demo'.
    
    To see all tasks and more detail, run gradlew tasks --all
    
    To see more detail about a task, run gradlew help --task <task>
    
    BUILD SUCCESSFUL in 0s
    1 actionable task: 1 executed
    

    分析和调试项目

    Gradle还提供了一个丰富的、基于web的构建视图,叫做 build scan(构建扫描)。

    尝试在执行任务时添加 --scan 来创建构建扫描。

    $ ./gradlew copy --scan
    
    BUILD SUCCESSFUL in 0s
    
    Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no]
    yes
    Gradle Terms of Service accepted.
    
    Publishing build scan...
    https://gradle.com/s/tetv3tbxy3wr4
    

    如果您浏览您的 build scan ,您应该能够很容易地找到在哪里执行的任务,它们花费了多少时间,应用了哪些插件,等等。

    发现可用的属性

    properties 命令告诉您项目的属性。

    $ ./gradlew properties
    
    > Task :properties
    
    ------------------------------------------------------------
    Root project
    ------------------------------------------------------------
    
    allprojects: [root project 'basic-demo']
    ant: org.gradle.api.internal.project.DefaultAntBuilder@33ad4252
    antBuilderFactory: org.gradle.api.internal.project.DefaultAntBuilderFactory@609be032
    artifacts: org.gradle.api.internal.artifacts.dsl.DefaultArtifactHandler_Decorated@1b9242eb
    asDynamicObject: DynamicObject for root project 'basic-demo'
    baseClassLoaderScope: org.gradle.api.internal.initialization.DefaultClassLoaderScope@35dd98fd
    buildDir: /Users/huangyoubin/Desktop/basic-demo/build
    buildFile: /Users/huangyoubin/Desktop/basic-demo/build.gradle
    buildPath: :
    buildScriptSource: org.gradle.groovy.scripts.TextResourceScriptSource@6cbbe3c6
    buildscript: org.gradle.api.internal.initialization.DefaultScriptHandler@539e0413
    childProjects: {}
    ...
    

    配置构建环境

    Gradle提供了多种机制来配置Gradle本身和特定项目的行为

    配置Gradle行为时,您可以使用这些方法,按从最高优先级到最低优先级的顺序列出(前一个获胜):

    • Command-line flags 例如 --build-cache. 它们优先于System properties和环境变量。
    • System properties 例如 systemProp.http.proxyHost=somehost.org 存储在gradle.properties文件中。
    • Gradle属性 例如 org.gradle.caching=true 通常存储在项目根目录的gradle.properties
    • 环境变量 例如 GRADLE_OPTS由执行Gradle的环境提供的

    Gradle属性

    Gradle提供了几个选项,可以轻松配置将用于执行构建的Java进程。

    为构建设置一致的环境需要将这些设置放入gradle.properties文件。配置按以下顺序应用(如果在多个位置配置选项,则最后一个获胜):

    • gradle.properties 在Gradle安装目录中。
    • gradle.properties 在项目根目录中。
    • gradle.propertiesGRADLE_USER_HOME目录中。
    • 系统属性,例如在-Dgradle.user.home命令行上设置的时间。

    以下属性可用于配置Gradle构建环境:

    • org.gradle.caching=(true,false)

      设置为true时,Gradle将尽可能重用任何先前构建的任务输出,从而使构建速度更快。

    • org.gradle.caching.debug=(true,false)

      设置为true时,将在控制台上记录各个输入属性哈希值以及每个任务的构建缓存键。

    • org.gradle.configureondemand=(true,false)

      允许按需孵化配置,Gradle将尝试仅配置必要的项目。

    • org.gradle.console=(auto,plain,rich,verbose)

      自定义控制台输出着色或详细程度。默认值取决于Gradle的调用方式。

    • org.gradle.daemon=(true,false)

      当设置true将使用Gradele守护进程来运行构建。默认是true

    • org.gradle.daemon.idletimeout=(# of idle millis)

      Gradle守护程序将在指定的空闲毫秒数后自行终止。默认为10800000(3小时)。

    • org.gradle.debug=(true,false)

      设置true为时,Gradle运行构建将启用远程调试,侦听端口5005.请注意,这相当于添加-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005到JVM命令行,并将挂起虚拟机,直到连接调试器。默认是false

    • org.gradle.java.home=(path to JDK home)

      指定Gradle构建过程的Java主目录。可以将值设置为 jdkjre的Path,但是,根据构建的功能,使用JDK会更安全。如果未指定设置,则会从您的环境(JAVA_HOME或路径java)派生合理的默认值。

    • org.gradle.jvmargs=(JVM arguments)

      指定用于Gradle守护程序的JVM参数

    • org.gradle.logging.level=(quiet,warn,lifecycle,info,debug)

      当设置为quiet,warn,lifecycle,info或debug时,Gradle将使用此日志级别。值不区分大小写。lifecycle级别是缺省值。

    • org.gradle.parallel=(true,false)

      开启并行编译

    • org.gradle.warning.mode=(all,none,summary)

      设置为allsummary或者none,Gradle将使用不同的警告类型显示。

    • org.gradle.workers.max=(max # of worker processes)

      配置后,Gradle最大将使用给定数量的工作者。默认值是CPU处理器数。

    • org.gradle.priority=(low,normal)

      指定Gradle守护程序的调度优先级以及它启动的所有进程。默认是normal

    配置JVM内存

    可以通过以下方式调整Gradle的JVM选项:

    org.gradle.jvmargs属性控制虚拟机上运行的配置。它默认为-Xmx512m "-XX:MaxMetaspaceSize=256m"

    更改构建VM的JVM设置

    org.gradle.jvmargs = -Xmx2g -XX:MaxMetaspaceSize = 512m -XX:+ HeapDumpOnOutOfMemoryError -Dfile.encoding = UTF-8
    

    Gradle Daemon

    Gradle在Java虚拟机(JVM)上运行,并使用几个需要初始化时间很长的支持库。因此,有时开始时看起来有点慢。这个问题的解决方案是Gradle 守护程序:一个长期存在的后台进程,它比其他情况下更快地执行构建。我们通过在内存中保存有关项目的数据以及利用缓存来避免昂贵的初始化过程。使用守护程序运行Gradle构建与没有守护程序没有区别。只需配置您是否要使用它 - 其他一切都由Gradle透明处理。

    为什么Gradle Daemon对性能很重要

    守护进程是一个长期存在的进程,因此我们不仅能够避免每次构建的JVM启动成本,而且还能够在内存中缓存有关项目结构,文件,任务等的信息。

    原因很简单:通过重用以前版本的计算来提高构建速度。但是,好处是显着的:我们通常会在后续构建中测量构建时间减少15-75%。我们建议您使用--profile了解Gradle Daemon对您可能产生的影响来分析您的构建。

    默认情况下,Gradle守护程序从Gradle 3.0开始启用,因此您无需执行任何操作即可从中受益。

    守护程序状态

    获取正在运行的Gradle守护程序及其状态的列表,请使用--status命令

    $ gradle --status
       PID STATUS   INFO
     28278 IDLE     5.5.1
    
    Only Daemons for the current Gradle version are displayed. 
    

    目前,Gradle只能连接到同一版本的守护进程。这意味着状态输出将仅显示被调用的Gradle版本的守护进程,而不显示任何其他版本。

    禁用守护程序

    默认情况下启用Gradle守护程序,我们建议始终启用它。有几种方法可以禁用守护程序,但最常见的方法是添加该行

    org.gradle.daemon=false
    

    到文件«USER_HOME»/.gradle/gradle.properties

    停止现有守护进程

    守护进程是一个后台进程。每个守护进程监视其内存使用情况与总系统内存的比较,并在可用系统内存不足时空闲时自动停止。如果您想出于任何原因显式停止运行Daemon进程,只需使用该命令即可gradle --stop

    相关文章

      网友评论

        本文标题:Gradle概述

        本文链接:https://www.haomeiwen.com/subject/bfjwrctx.html