教程 > Gradle > Gradle 教程 阅读:92

Gradle 项目和任务

gradle build 由一个或多个项目组成。 Gradle 中的一切都是基于项目和任务的。

Gradle 任务

在 Gradle 中,任务是构建执行的单个工作单元。这些任务可以是编译类、创建 JAR、生成 Javadoc 以及将一些档案发布到仓库等等。 它可以被视为构建过程的单个原子工作。

Gradle 的优势在于他的可扩展模型; 任务是这个模型的核心。 任务是 Gradle 运行的独立单元。 任务的本质是它的动作。 例如,我们可以声明一个任务来编译 Java 源代码或将一些数据从一个目录复制到另一个目录。 一个任务可以单独执行一些动作,但我们也可以声明对其他任务的依赖。 任务还可以定义它的输入和它读取和写入的文件的输出。 这允许 Gradle 确定是否需要完成任务。


Gradle 项目

在 Gradle 中,一个项目显示一个库 JAR 或一个 Web 应用程序。 它还可以提供一个分发 ZIP,该 ZIP 由其他项目生成的 JAR 组装而成。 一个项目可以将我们的应用程序部署到暂存或生产环境。 Gradle 中的每个项目都由一个或多个任务组成。我们可以将其与构建的示例联系起来; 它可以有任意数量的层。


任务类型

Gradle 中有两种类型的任务。 它们如下:

  • 默认任务
  • 自定义任务

默认任务

默认任务是 Gradle 的预定义任务。 我们可以在我们的项目中定义它。 Gradle 让我们定义一个或多个默认任务,如果没有指定其他任务则执行这些任务。

我们可以通过运行 gradle task 命令列出默认任务。 如下所示:

gradle 列出任务

自定义任务

Gradle 允许我们创建任务; 这些任务称为自定义任务。 自定义任务是为执行某些特定工作而构建的用户定义任务。

语法

Task task_name{  
    group "-------group_name for task-------'  
    description '-------description of the task-------'  
    doLast{  
    -------code for execution-------  
        -----------------------------------  
        -----------------------------------  
    }  
}  

下面我们来创建一个任务。打开 build.gradle ,添加如下内容

task jiyik_task{  
    group "Custom task"  
    description "迹忆客 Gradle Custom task Example."  
    doLast{  
        println "Welcome to 迹忆客. It is a Custom task Example.";  
    }  
}

然后我们继续使用 gradle task 命令来查看我们的任务

gradle 自定义任务

现在,要执行我们的自定义任务,运行命令 gradle taskname(因为taskname是 jiyik_task,所以实际命令为 gradle jiyik_task)。 看下面的输出:

gradle 执行自定义任务

使用 DSL 特定语法定义任务

在新文件夹中,使用以下代码创建 build.gradle 文件(使用 Groovy DSL 编写)或 build.gradle.kts 文件(使用 Kotlin DSL 编写):

tasks.register("hello") {   
    doLast {   
        println 'Hello, World!'  
    }  
}

上面的 Groovy 代码将注册一个名为 hello 的新必需任务,并将消息打印到控制台。

保存文件并运行以下命令:

$ gradle tasks --all

我们的新任务将出现在其他任务下。

使用字符串作为任务名称定义任务:

我们可以使用字符串作为任务名称来定义任务。 例如,我们要定义一个任务名称 'hello',将以下代码放入 build.gradle 文件中:

task('hello') {  
    doLast {  
        println "hello"  
    }  
}  
task('copy', type: Copy) {  
    from(file('srcDir'))  
    into(buildDir)  
}

还有另一种定义任务的方法(我们也可以使用任务容器来定义任务)。

使用任务容器定义任务

TaskContainer 管理一组 Task 实例。 我们可以通过调用 Project.getTasks() 来访问 TaskContainer 实例,也可以在构建脚本中使用 tasks 属性。

我们看下TaskContainer的定义:

public interface TaskContainer extends TaskCollection<Task>, PolymorphicDomainObjectContainer<Task> 

使用 TaskContainer 定义任务的“hello world”示例如下:

tasks.create('hello') {  
    doLast {  
        println "hello"  
    }  
}  
tasks.create('copy', Copy) {  
    from(file('srcDir'))  
    into(buildDir)  
}  

在这里,我们可以将任务添加到任务集合中。

自定义任务中的 doFirst 和 doLast 块

在 Gradle 中,doFirstdoLast 是两个不同的自定义任务块。 这些块在块部分内定义。 在 doFirst 块中,我们确定要首先执行的任务,而 doLast 块用于最后运行任务。 考虑下面的代码片段:

task A{  
    doFirst{  
        println "Hello welcome to 迹忆客"  
    }  
    doLast{  
        println "Thank You Bye Bye."  
    }  
}  

执行上面的任务,我们可以看到下面的输出结果。

gradle 执行自定义任务 doLast doFirst

在 Gradle 中复制任务

Gradle 允许我们将任务从一个目录复制到另一个目录。 以下语法用于复制任务:

task task_name(type: Copy){  
    From "--------------------DirectoryPath----------------"  
    Into " --------------------DirectoryPath----------------"  
}  

任务分组

在 Gradle 中,我们可以对任务进行分组。 为了对任务进行分组,我们将为所有任务使用相同的组名。 要对名为 jiyik1 和 jiyik2 的两个任务进行分组,请将以下代码写入 build.gradle 文件:

task jiyik1{  
    group "jiyik_task"  
    doLast{  
        println "This is a task 1."   
    }  
}  
task jiyik2{  
    group "jiyik_task"  
    doLast{  
        println "This is a task 2."   
    }  
}  

跳过任务

在 Gradle 中,有多种方法可以跳过任务的执行。 要跳过任务,请将 onlyIf() 附加到任务代码。 考虑下面的代码片段:

task jiyik1{  
    group "jiyik_task1"  
    doLast{  
        println "This is a task."   
    }  
}  
jiyik1.onlyIf{  
    project.hasProperty('doOperation')  
}  

使用谓词跳过任务

在 Gradle 中,onlyif() 方法可以附加一个谓词。 在这种情况下,任务仅在谓词为真时执行。 谓词实现为闭包,并通过参数传递。 如果任务被执行,则返回 true,否则返回 false。 如果任务被跳过。 谓词在任务之前进行评估。 考虑下面的代码片段:

task test_Jiyik{  
    group "Task1"  
    doLast{  
        println "This is a task."   
    }  
}  
test_Jiyik.onlyIf{  
    !project.hasProperty('skipTest')  
}

使用 StopExecutionException 跳过任务

在 Gradle 中,我们还可以使用 StopExecutionException 而不是谓词跳过任务。 如果这个异常被抛出到一个任务中,则跳过该任务的动作,并且构建继续执行下一个任务。 考虑下面的代码片段:

task compile{
    doLast{
        println "Here we are compiling"  
    }
}
compile.doFirst{
    if (true)
    {
        throw new StopExecutionException()  
    }
}
task Javatpoint (dependsOn: 'compile') {
    doLast{
        println 'i am not affected'  
    }
}

启用和禁用任务

Gradle 允许我们启用和禁用任务; 默认情况下,它是启用的。 要禁用任务,我们必须将其标记为已跳过。 考虑下面的代码片段:

task jiyik_disableTask{  
    doLast{  
        println "this statement should not be printed if the task is disabled."  
        }  
}  
jiyik_disableTask.enabled = false  

Gradle 中的任务依赖

当一个任务依赖于另一个任务时使用任务依赖。 dependsOn 关键字与任务名称一起使用以使任务依赖。

考虑下面的示例,它包含两个名为 jiyikOperation1jiyikOperation2 的任务。 第二个任务与第一个任务有'depends on'关键字,这意味着第二个任务只有在第一个任务成功执行时才会执行:

task jiyikOperation1{  
    group "CustomTasks"  
    doLast{  
        println "This is operation 1 of Jiyik"  
    }  
}  
task jiyikOperation2(dependsOn: 'javatpointOperation1'){  
    group "CustomTasks"  
    doLast{  
        println "This is operation 2 of Jiyik"  
    }  
}  

Gradle 中任务的快捷方式表示法

我们可以创建现有任务的快捷方式,每个任务都被视为构建脚本的属性。 为此,请在 build.gradle 文件中添加以下代码片段。

task Jiyik {  
    doLast {  
        println 'Hello world!'  
    }  
}  
Jiyik.doLast {  
    println "Greetings from the $Jiyik.name task."  
}  

任务中的自定义属性

在 Gradle 中,我们可以创建属性并将其添加到任务中。 要添加属性,请将 ext.myProperty 设置为任务的初始值。 考虑下面的代码片段:

task JiyikTask {  
    ext.myProperty = "This is a custom property"  
}  
task printTask {  
    doLast {  
        println JiyikTask.myProperty  
    }  
}  

查看笔记

扫码一下
查看教程更方便